A。胜利大逃亡
HDU 1253
很简单的三维BFS,直接贴代码。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2000005 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define ll long long using namespace std; struct kdq { int x,y,z,step; }; int movex[6]={0,0,1,-1,0,0}; int movey[6]={0,0,0,0,1,-1}; int movez[6]={1,-1,0,0,0,0}; bool visit[51][51][51]; int mm[100][100][100]; int A,B,C,T; int inmap(kdq a) { if(a.x>=0&&a.x<A&&a.y>=0&&a.y<B&&a.z>=0&&a.z<C) return 1; return 0; } kdq q[Max]; int bfs() { int num=0,cnt=0; q[0].x=0,q[0].y=0,q[0].z=0,q[0].step=0; visit[0][0][0]=1; num++; while(num>cnt) { kdq temp=q[cnt++]; //cout<<temp.x<<" "<<temp.y<<" "<<temp.z<<endl; if(temp.x==(A-1)&&temp.y==(B-1)&&temp.z==(C-1)) { return temp.step; } for(int i =0 ;i < 6 ;i ++) { kdq next; next.x=temp.x+movex[i]; next.y=temp.y+movey[i]; next.z=temp.z+movez[i]; //cout<<next.x<<" "<<next.y <<" "<<next.z<<endl; next.step=temp.step+1; if(inmap(next)&&!visit[next.x][next.y][next.z]&&!mm[next.x][next.y][next.z]) { q[num++]=next; visit[next.x][next.y][next.z]=1; } } } return -1; } int main() { int t; cin>>t; while (t--) { scanf("%d%d%d%d",&A,&B,&C,&T); memset(visit,0,sizeof(visit)); for( int i =0 ;i < A ; i ++) { for (int j =0 ;j < B ;j ++) { for (int k = 0; k < C ; k ++) { scanf("%d",&mm[i][j][k]); } } } int ans=bfs(); if(ans<=T) cout<<ans<<endl; else cout<<-1<<endl; } return 0; }B。prim ring problem
HDU 1016
题目意思很简单,我的作法就是从1开始dfs找到即输出,这样可以保证是按照字典序,然后就是dfs的细节了,写的有点粗糙,下次改=。=现在脑袋好乱。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2000005 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define ll long long using namespace std; int vis[1000]; bool isvis[1000]; bool flag[1000]; void isprime()//素数表,数据不大,所以100以内就够了 { flag[0]=1; flag[1]=1; for( int i = 2 ; i < 100 ; i ++) { if(!flag[i]) { for (int j = i*2 ; j < 100 ; j+= i) flag[j]=1; } } } void dfs(int n,int pre,int num) { if(n == num&&!flag[1+pre])//找到即输出 ,这里输出有点麻烦,一开始是用vector的 。。但是忘了earse的用法,怒跪,所以下次改。 { cout<<1; for(int i=2;i <=n ;i++) { for (int j = 2 ;j <=n ; j ++) { if(vis[j]==i) { cout<<" "<< j; continue; } } } cout<<endl; } for (int i = 1 ; i <= n ; i++) { if(!vis[i]) { if(!flag[i+pre]) { vis[i]=num+1; int k=num; k++; dfs(n,i,k); vis[i]=0; } } } } int main() { int n ; isprime(); int cas=1; while(cin >> n ) { printf("Case %d:\n",cas++); vis[1] = 1; dfs(n,1,1); cout << endl; } }C。Tetris
HDU3647
大模拟。还没做
D。seaside
HDU 3665
题意:一个人从0开始到最近的海边的路程。
思路:数据超小,直接枚举所有的路取最小值=。=
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2000005 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define ll long long using namespace std; int mm[20][20]; int side[100]; int ans=inf; int n; bool vis[100]; void dfs(int now,int num,int ok)//now表示走到哪里,num表示走的路程 ,ok表示是否到海边 { if(ok) { ans=min(ans,num); return ; } for (int i = 0 ; i < n ; i ++) { if(!vis[i]) { if(mm[now][i]) { vis[i]=1; int k =num ; k+=mm[now][i]; if(side[i]) dfs(i,k,1); else dfs(i,k,0); vis[i]=0; } } } } int main() { while(cin >> n) { memset(mm,0,sizeof(mm)); memset(vis,0,sizeof(vis)); ans=inf; for (int i = 0 ; i < n ; i ++) { int a,b; cin >> a >> b; side[i]=b; while(a--) { int x,y; cin >> x>> y; mm[i][x]=y; } } vis[0]=1; dfs(0,0,0); cout<<ans<<endl; } }
E。divisibility
题意:给出一堆数字,问你这里面互质的数字最多是多少(题意描述和这里略有不同,但是我是这么理解的,写起来也不复杂,不用想那么多)。
其实这一题我觉得还是有数论的方法的,但是我一看数据范围=。=,就直接决定枚举了。。然后就过了。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2000005 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define ll long long using namespace std; ll a[10000]; int main() { int T; cin >>T; while( T--) { int n ; cin >> n ; for (int i =0 ; i < n ; i++ ) cin >>a[ i]; sort(a,a+n); int ans = 1; vector<int>nn; for (int k = 0 ; k < n ; k ++) { nn.clear(); if(a[k]==1) continue; int minn = a[k]; int num = 1 ; nn.push_back(minn);//枚举所有的元素,当然1除外 for (int i = k+1; i < n ; i++) { if(a[i]!=minn&&a[i]!=1) { bool ok = 0; int size=nn.size(); for(int j = 0 ; j < size; j++) { if(a[i]%nn[j]==0) { ok = 1; break; } } if(!ok) { nn.push_back(a[i]); num++; } } } ans = max (ans, num); } cout<<ans<<endl; } }F。hello world!
hdu3257
还没做,比赛时没做出来=。=因为没找出规律。。。
然后看了一句话就瞬间懂了=。=,这题考的显然就是想象力=。=
明天来贴。
作者:kdqzzxxcc 发表于2013-3-14 0:39:25 原文链接
阅读:115 评论:0 查看评论