A。勝利大逃亡 HDU 1253 很簡單的三維BFS,直接貼代碼。 [cpp] #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的細節了,寫的有點粗糙,下次改=。=現在腦袋好亂。 [cpp] #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開始到最近的海邊的路程。 思路:數據超小,直接枚舉所有的路取最小值=。= [cpp] #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 題意:給出一堆數字,問你這裡面互質的數字最多是多少(題意描述和這裡略有不同,但是我是這麼理解的,寫起來也不復雜,不用想那麼多)。 其實這一題我覺得還是有數論的方法的,但是我一看數據范圍=。=,就直接決定枚舉了。。然後就過了。 [cpp] #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); } www.2cto.com cout<<ans<<endl; } } F。hello world! hdu3257 還沒做,比賽時沒做出來=。=因為沒找出規律。。。 然後看了一句話就瞬間懂了=。=,這題考的顯然就是想象力=。= 明天來貼。