noi寒假刷题之旅_ 2.5基本算法之搜索(36题)
»2.5基本算法之搜索(36题)
1159:Maze
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include<iostream> #include<cstring> #define MAX 22 /* 用dfs会出现先到达终点,但是钥匙没找完的情况 */ using namespace std; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int n,M; char t[MAX][MAX]; int vis[MAX][MAX]; struct Pos { int x,y; } s,m[5]; int key[5],r[5],locx[5],locy[5],flag=0; bool check() { for ( int i=0; i<5; i++) if (key[i]!=r[i]) return 1; return 0; } void DFS( int posi, int posj) { if (t[posi][posj]== 'G' ) { flag=1; return ; } if (( 'A' <=t[posi][posj]&&t[posi][posj]<= 'E' )||t[posi][posj]== 'X' ||posi<=0||posi>M||posj<=0||posj>n){ return ; } if ( 'a' <=t[posi][posj]&&t[posi][posj]<= 'e' ) { key[t[posi][posj]- 'a' ]--; if (!key[t[posi][posj]- 'a' ]) t[locx[t[posi][posj]- 'a' ]][locy[t[posi][posj]- 'a' ]]= '.' ; t[posi][posj]= '.' ; // if(!key[t[posi][posj]-'a']) t[m[t[posi][posj]-'a'].x][m[t[posi][posj]-'a'].y]='.'; } for ( int i=0;i<4;++i) { if (vis[dx[i]+posi][dy[i]+posj]) continue ; else vis[dx[i]+posi][dy[i]+posj]=1; DFS(dx[i]+posi,dy[i]+posj); if (flag) return ; } } void inti() { memset (t, 'X' , sizeof (t)); memset (vis,0, sizeof (vis)); memset (key,0, sizeof (key)); memset (r,0, sizeof (r)); memset (m,0, sizeof (m)); flag=0; } int main() { while (~ scanf ( "%d%d" ,&M,&n)) { if (M==0&&n==0) break ; for ( int i=1;i<=M;++i) { getchar (); for ( int j=1;j<=n;++j) { cin>>t[i][j]; if (t[i][j]== 'S' ){ s.x=i;s.y=j; } if ( 'a' <=t[i][j]&&t[i][j]<= 'e' ){ key[t[i][j]- 'a' ]++; } //保存一下每种钥匙的数量 if (t[i][j]>= 'A' &&t[i][j]<= 'E' ) locx[t[i][j]- 'A' ]=i,locy[t[i][j]- 'A' ]=j; //存放每一个门的位置 // if('A'<=t[i][j]&&t[i][j]<='E'){ m[t[i][j]-'A'].x=i; m[t[i][j]-'A'].y=j; }//保存一下门的位置 } } do { memcpy (r,key, sizeof (r)); memset (vis,0, sizeof (vis)); DFS(s.x,s.y); } while (check()); if (flag){ cout<< "YES\n" ; } else { cout<< "NO\n" ; } inti(); } return 0; } |
1253:Dungeon Master_三维
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include<iostream> #include<queue> #include<stdio.h> #include<cstring> #define MAX 35 using namespace std; int l,r,c,re; char mep[MAX][MAX][MAX]; int vis[MAX][MAX][MAX]; int dir[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}}; struct node { int x,y,z,step; }; struct node e,start; bool check(node t) { if (t.x<0||t.x>=l||t.y<0||t.z<0||t.y>=r||t.z>=c) return true ; else if (vis[t.x][t.y][t.z]) return true ; else if (mep[t.x][t.y][t.z]== '#' ) return true ; return false ; } int bfs() { queue<node> Q; start.step = 0; Q.push(start); vis[start.x][start.y][start.z]=1; while (!Q.empty()) { node t=Q.front();Q.pop(); if ((t.x == e.x)&&(t.y == e.y)&&(t.z == e.z)) return t.step; for ( int i=0;i<6;++i) { node temp;temp=t; temp.x = t.x+dir[i][0],temp.y = t.y+dir[i][1],temp.z =t.z+ dir[i][2]; if (!check(temp)) { vis[temp.x][temp.y][temp.z]=1; temp.step++; Q.push(temp); } } } return 0; } int main() { while ( scanf ( "%d%d%d" ,&l,&r,&c)&&(l||r||c)) { memset (vis,0, sizeof (vis)); memset (mep, '#' , sizeof (mep)); for ( int i=0;i<l;++i) for ( int j=0;j<r;++j) { scanf ( "%s" ,mep[i][j]); for ( int k=0;k<c;++k) { if (mep[i][j][k]== 'E' ) { e.x=i;e.y=j;e.z=k; } if (mep[i][j][k]== 'S' ) { start.x=i;start.y=j;start.z=k; } } } re = bfs(); if (re) cout<< "Escaped in " <<re<< " minute(s).\n" ; else cout<< "Trapped!\n" ; } } |
131:Channel Allocation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include<iostream> #include<string.h> #include<string> #include<vector> #define MAX 27 using namespace std; typedef struct s { int num; //数字 int color; //数字对应的颜色 }Color; vector<Color>c[MAX]; Color mark[MAX]; int n=0; string temp; int vis[MAX]; void intial() { memset (vis,0, sizeof ( int )*4); memset (mark,0, sizeof (Color)*MAX); for ( int i=0;i<MAX;++i)c[i].clear(); temp= "" ; } bool End() { for ( int i=0;i<n;++i) { if (!mark[i].color) return false ; } return true ; } int max; void dfs( int index) { if (index==n) return ; //如果遍历完最后一个就结束 if (End()) return ; //是否涂色完毕 if (c[index].size()!=1) //只有头 { int Color_num[5]={}; for ( int i=1;i<c[index].size();++i) if (mark[c[index][i].num].color) { Color_num[mark[c[index][i].num].color]=1; } //找一下周围的颜色有哪些,然后把它们去除 for ( int i=1;i<=4;++i) { if (!Color_num[i]) { if (End()) return ; mark[c[index][0].num].color=i; //涂色 dfs(index+1); } } } else { if (End()) return ; dfs(index+1); } return ; } int main() { while (cin>>n&&n) { intial(); for ( int j=0;j<n;++j) { cin>>temp; Color now;now.num=temp[0]- 'A' ; c[j].push_back(now); //数组第一位放头 mark[now.num].num=now.num; for ( int i=2;i<temp.length();++i) { now.num=temp[i]- 'A' ; c[j].push_back(now); } } dfs(0); //传入数组第一个 int count=mark[0].color; for ( int i=1;i<n;++i) { if (count<mark[i].color) count=mark[i].color; } if (count) { if (count==1)cout<< "1 channel needed." <<endl; else cout<<count<< " channels needed." <<endl; } else { if (n==2)cout<< "1 channel needed." <<endl; if (n==3)cout<< "3 channels needed." <<endl; if (n>=4) cout<< "4 channels needed." <<endl; } } return 0; } |
1388:Lake Counting
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include<iostream> #include<string.h> #include<string> #include<queue> #define MAX 102 using namespace std; string mark[MAX]; int vis[MAX][MAX],ans,n,m,flag; int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}}; struct node { int x,y; }; bool Check(node t) { if (t.x<0||t.y<0||t.x>=n||t.y>=m) return false ; else if (vis[t.x][t.y]) return false ; else if (mark[t.x][t.y]== 'W' ) return true ; else return false ; } void bfs(node start) { queue<node> Q; Q.push(start); vis[start.x][start.y]=1; while (!Q.empty()) { node t = Q.front();Q.pop(); for ( int i=0;i<8;++i) { node newt; newt.x = t.x+dir[i][0],newt.y=t.y+dir[i][1]; if (Check(newt)) { vis[newt.x][newt.y]=1; mark[newt.x][newt.y]= '.' ; Q.push(newt); } } } } int main() { cin>>n>>m; memset (vis,0, sizeof (vis)); for ( int j=0;j<n;++j) cin>>mark[j]; for ( int i=0;i<n;++i) for ( int j=0;j<m;++j) if (mark[i][j]== 'W' ) { node s;ans++; s.x=i,s.y=j; bfs(s); } cout<<ans; return 0; } |
1490:A Knight's Journey
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<iostream> #include<string.h> #include<string> #include<stdio.h> #include<queue> #define MAX 102 using namespace std; struct node{ int x,y; }; node re[MAX]; //放坐标 int vis[MAX][MAX],len=1,ans,n,flag,a,b; int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2} }; bool Check(node t) { if (t.x<1||t.y<1||t.x>a||t.y>b) return false ; else if (vis[t.x][t.y]) return false ; else return true ; } void dfs(node start, int num) { if (!flag) { re[num].x=start.x,re[num].y=start.y; if (num==a*b) { flag=1; return ; } } node t; for ( int i=0;i<8;++i) { t.x = start.x+dir[i][0],t.y = start.y+dir[i][1]; if (Check(t)) { vis[start.x][start.y]=1; dfs(t,num+1); vis[start.x][start.y]=0; } } } int main() { cin>>n; for ( int i=1;i<=n;++i) { memset (vis,0, sizeof (vis)); flag=0; cin>>a>>b; re[1].x=1,re[1].y=1; cout<< "Scenario #" <<i<< ":\n" ; dfs(re[1],1); if (flag) { for ( int j=1;j<=a*b;++j) printf ( "%c%d" ,re[j].y+64,re[j].x); cout<< "\n\n" ; } else { cout<< "impossible\n\n" ; } } return 0; } |
156:LETTERS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include<iostream> #include<queue> #include<string> #define MAX 25 using namespace std; int n,k; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int v[MAX][MAX]; int vv[26]; string m[MAX]; int ans; bool Check( int x, int y) { if (x<0||x>=n||y<0||y>=k) return false ; else if (v[x][y]) return false ; else if (vv[m[x][y]- 'A' ]) return false ; else return true ; } void dfs( int x, int y, int step) { // cout<<"\t\t\t\t>>("<<x<<","<<y<<")\n"; // for(int i=0;i<n;++i) // { // for(int j=0;j<k;++j) // { // cout<<v[i][j]; // } // cout<<endl; // } if (step>ans) ans=step; for ( int i=0;i<4;++i) { int newx,newy; newx = x+dir[i][0],newy = y+dir[i][1]; if (Check(newx,newy)) { v[newx][newy]=1; vv[m[newx][newy]- 'A' ]=1; step++; dfs(newx,newy,step); step--; v[newx][newy]=0; vv[m[newx][newy]- 'A' ]=0; } } // cout<<"\t\t\t\t<<("<<x<<","<<y<<")\n"; } int main() { cin>>n>>k; for ( int i=0;i<n;++i)cin>>m[i]; v[0][0]=1;vv[m[0][0]- 'A' ]=1; dfs(0,0,1); cout<<ans; return 0; } |
166:The Castle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include<iostream> #define MAX 55 using namespace std; int n,m,t; int dir[4][2]={ {0,1}, {1,0}, {0,-1}, {-1,0} }; //西北东南 struct node { int w[4]; }; int v[MAX][MAX]; node mep[MAX][MAX]; int coun=0,maxs=1; bool Check( int x, int y) { if (x<1||x>n||y<1||y>m) return false ; else if (v[x][y]) return false ; else return true ; } int spare; void dfs( int x, int y) { if (spare>maxs) maxs=spare; // cout<<"空间大小:"<<spare<<endl; // for(int i=1;i<=n;++i) // { // for(int j=1;j<=m;++j) // { // cout<<v[i][j]; // } // cout<<endl; // } for ( int i=0;i<4;++i) { int newx,newy; newx=x+dir[i][0],newy=y+dir[i][1]; if (Check(newx,newy)&&!mep[newx][newy].w[i]) { v[newx][newy]=1;spare+=1; dfs(newx,newy); } } } int main() { cin>>n>>m; for ( int i=1;i<=n;++i) for ( int j=1;j<=m;++j) { cin>>t; if (t&1) mep[i][j].w[0]=1; //西 if (t&2) mep[i][j].w[1]=1; //北 if (t&4) mep[i][j].w[2]=1; //东 if (t&8) mep[i][j].w[3]=1; //南 } for ( int i=1;i<=n;++i) for ( int j=1;j<=m;++j) if (!v[i][j]) { v[i][j]=1; ++coun;spare=1; // cout<<" >>"<<"("<<i<<","<<j<<")"<<endl; dfs(i,j); // cout<<" <<"<<"("<<i<<","<<j<<")"<<endl; } cout<<coun<<endl<<maxs; return 0; } |
1700:八皇后问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include<iostream> #include<cmath> #include<string.h> using namespace std; int n=8,tot; int col[8]={0}; bool check( int c, int r) { for ( int i=0;i<r;++i) { if (col[i]==c||( abs (col[i]-c)== abs (i-r))) { return false ; } } return true ; } void DFS( int r) { if (r==n) { cout<< "No. " <<++tot<<endl; int i,j; for (i=0;i<8;++i) { for (j=0;j<8;++j) { if (i==col[j]) { if (j==7)cout<<1; else cout<<1<< " " ; } else { if (j==7)cout<<0; else cout<<0<< " " ; } } cout<<endl; } return ; } for ( int c=0;c<n;++c) { if (check(c,r)) { col[r]=c; DFS(r+1); } } } int main() { DFS(0); return 0; } |
1756:八皇后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include<iostream> #include<cmath> #include<string.h> using namespace std; int n=8,m,nn,tot; int col[8]={0}; string s[93]; bool check( int c, int r) { for ( int i=0;i<r;++i) { if (col[i]==c||( abs (col[i]-c)== abs (i-r))) { return false ; } } return true ; } void DFS( int r) { if (r==n) { for ( int i=0;i<8;++i)s[tot]+=col[i]+1+ '0' ; tot++; // cout<<tot<<":"<<s[tot]<<endl; return ; } for ( int c=0;c<n;++c) { if (check(c,r)) { col[r]=c; DFS(r+1); } } } int main() { cin>>nn; DFS(0); while (nn--) { cin>>m; cout<<s[m-1]<<endl; } // for(int i=0;i<8;++i)cout<<i<<","<<col[i]<<endl; return 0; } |
1789:算24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<iostream> #include<cstring> #include<cmath> using namespace std; double a[5]; int v[5]; int dfs( int t) { if (t==4) { for ( int i=1;i<5;++i) { if (v[i]) continue ; if ( fabs (a[i]-24.0)<1e-7) return 1; } } for ( int i=1;i<5;++i) { if (v[i]) continue ; for ( int j=i+1;j<5;++j) { if (v[j]) continue ; v[j]=1; double aa=a[i],b=a[j]; a[i] = aa+b; if (dfs(t+1)) return 1; a[i] = aa-b; if (dfs(t+1)) return 1; a[i] = b-aa; if (dfs(t+1)) return 1; a[i] = aa*b; if (dfs(t+1)) return 1; a[i] = aa/b; if (dfs(t+1)) return 1; a[i] = b/aa; if (dfs(t+1)) return 1; a[i] = aa; v[j] = 0; } } return 0; } int main() { while (cin>>a[1]>>a[2]>>a[3]>>a[4]&&(a[1]||a[2]||a[3]||a[4])) { memset (v,0, sizeof (v)); if (dfs(1))cout<< "YES\n" ; else cout<< "NO\n" ; } return 0; } |
1792:迷宫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include<iostream> #include<cstring> #include<cmath> #include<queue> #define MAX 102 using namespace std; string m[MAX]; int v[MAX][MAX],n,flag; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; struct node { int x,y; }; node s,e; bool Check(node now) { if (now.x<0||now.y<0||now.x>=n||now.y>=n) return false ; else if (v[now.x][now.y]) return false ; else if (m[now.x][now.y]== '#' ) return false ; else return true ; } void bfs(node ss) { queue<node> Q; Q.push(ss); v[ss.x][ss.y]=1; while (!Q.empty()) { node f = Q.front();Q.pop(); if (f.x==e.x&&f.y==e.y){ flag=1; return ; } if (flag) return ; for ( int i=0;i<4;++i) { node t; t.x=f.x+dir[i][0],t.y=f.y+dir[i][1]; if (Check(t)) { v[t.x][t.y]=1; Q.push(t); } } } } int main() { int k;cin>>k; while (k--) { memset (v,0, sizeof (v));flag=0; cin>>n; for ( int i=0;i<n;++i) cin>>m[i]; cin>>s.x>>s.y>>e.x>>e.y; if (!Check(s)){ cout<< "NO\n" ; continue ; } bfs(s); if (flag)cout<< "YES\n" ; else cout<< "NO\n" ; } return 0; } |
1818:红与黑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include<iostream> #include<cstring> #include<cmath> #include<queue> #define MAX 102 using namespace std; string m[MAX]; int v[MAX][MAX],w,h,flag; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; struct node { int x,y,c; }; node s,e; bool Check(node now) { if (now.x<0||now.y<0||now.x>=w||now.y>=h) return false ; else if (v[now.x][now.y]) return false ; else if (m[now.x][now.y]== '#' ) return false ; else return true ; } void bfs(node ss) { queue<node> Q; Q.push(ss); v[ss.x][ss.y]=1;ss.c=1; while (!Q.empty()) { node f = Q.front();Q.pop(); for ( int i=0;i<4;++i) { node t=f; t.x=f.x+dir[i][0],t.y=f.y+dir[i][1]; if (Check(t)) { v[t.x][t.y]=1;t.c++; Q.push(t); } } } } int main() { while (cin>>h>>w&&(w||h)) { memset (v,0, sizeof (v));flag=0; for ( int i=0;i<w;++i) { cin>>m[i]; for ( int j=0;j<h;++j) if (m[i][j]== '@' ) { s.x=i,s.y=j;} } bfs(s); for ( int i=0;i<w;++i) for ( int j=0;j<h;++j) if (v[i][j]) flag++; cout<<flag<< "\n" ; } return 0; } |
2727:仙岛求药
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<iostream> #include<queue> #include<string> #include<cstring> #define MAXX 10000 #define MAX 25 using namespace std; int n,M,ans; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int v[MAX][MAX]; string m[MAX]; struct node { int x,y,step; }; node s,e,F; bool Check( int x, int y) { if (x<0||x>=M||y<0||y>=n) return false ; else if (v[x][y]) return false ; else if (m[x][y]== '#' ) return false ; else return true ; } void bfs(node S) { queue<node> Q; Q.push(S); v[S.x][S.y]=1; while (!Q.empty()) { F = Q.front();Q.pop(); // if(F.x==e.x&&F.y==e.y) cout<<"现在的步数:"<<F.step<<endl; for ( int i=0;i<4;++i) { node news=F; news.x = F.x+dir[i][0],news.y = F.y+dir[i][1]; if (Check(news.x,news.y)) { v[news.x][news.y]=1;news.step++; if (news.x==e.x&&news.y==e.y) { ans = news.step; return ; } Q.push(news); } } } } int main() { while (cin>>M>>n&&(M||n)) { memset (v,0, sizeof (v));ans=0; for ( int i=0;i<M;++i) { cin>>m[i]; for ( int j=0;j<n;++j) { if (m[i][j]== '@' ) s.x=i,s.y=j; if (m[i][j]== '*' ) e.x=i,e.y=j; } } bfs(s); if (ans) cout<<ans<<endl; else cout<<-1<<endl; } return 0; } |
2753:走迷宫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include<iostream> #include<queue> #include<string> #include<cstring> #define MAXX 10000 #define MAX 45 using namespace std; int R,C,ans; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int v[MAX][MAX]; string m[MAX]; struct node { int x,y,step; }; node s,e,F; bool Check( int x, int y) { if (x<0||x>=R||y<0||y>=C) return false ; else if (v[x][y]) return false ; else if (m[x][y]== '#' ) return false ; else return true ; } void bfs(node S) { queue<node> Q; Q.push(S); v[S.x][S.y]=1; while (!Q.empty()) { F = Q.front();Q.pop(); for ( int i=0;i<4;++i) { node news=F; news.x = F.x+dir[i][0],news.y = F.y+dir[i][1]; if (Check(news.x,news.y)) { v[news.x][news.y]=1;news.step++; if (news.x==e.x&&news.y==e.y) { ans = news.step; return ; } Q.push(news); } } } } int main() { cin>>R>>C; memset (v,0, sizeof (v));ans=0; for ( int i=0;i<R;++i) cin>>m[i]; s.x=0,s.y=0,e.x=R-1,e.y=C-1; bfs(s); cout<<ans+1<<endl; return 0; } |
2971:抓住那头牛
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include<iostream> #include<string.h> #include<queue> using namespace std; int to[2]={1,-1}; int a,b,sum; int vis[100000]; struct place { int x, time ; }; int check(place k) { if (k.x<0||k.x>100000||vis[k.x]==1) return 0; return 1; } int bfs(place n) { place m,next; queue<place>w; w.push(n); while (!w.empty()) { m=w.front(); w.pop(); if (m.x==b) return m. time ; for ( int i=0;i<2;i++) { next.x=m.x+to[i]; next. time =m. time +1; if (next.x==b) return next. time ; if (check(next)) { w.push(next); vis[next.x]=1; } } next.x=m.x*2; next. time =m. time +1; if (next.x==b) return next. time ; if (check(next)) { w.push(next); vis[next.x]=1; } } return 0; } int main() { int i,j,t; place x1; while (~ scanf ( "%d %d" ,&a,&b)) { x1.x=a; x1. time =0; vis[x1.x]=1; sum=0; sum=bfs(x1); printf ( "%d\n" ,sum); } return 0; } |
8465:马走日
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include<iostream> #include<queue> #include<string> #include<cstring> #define MAXX 10000 #define MAX 45 using namespace std; int n,T,m,ans; int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}}; int v[MAX][MAX]; struct node { int x,y,step; }; node s,e,F; bool Check( int x, int y) { if (x<0||x>=n||y<0||y>=m) return false ; else if (v[x][y]) return false ; else return true ; } void dfs(node S) { if (S.step==n*m){ ans++; return ;} for ( int i=0;i<8;++i) { node news=S; news.x = S.x+dir[i][0],news.y = S.y+dir[i][1]; if (Check(news.x,news.y)) { v[news.x][news.y]=1; news.step++; dfs(news); v[news.x][news.y]=0; news.step--; } } } int main() { cin>>T; while (T--) { cin>>n>>m>>s.x>>s.y;ans=0; memset (v,0, sizeof (v)); v[s.x][s.y]=1;s.step=1; dfs(s); cout<<ans<<endl; } return 0; } |
6264:走出迷宫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include<iostream> #include<queue> #include<string> #include<cstring> #define MAXX 10000 #define MAX 205 using namespace std; int M,N,T,ans=0; int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; int v[MAX][MAX]; string m[MAX]; struct node { int x,y,step,t; }; node s,e; bool Check(node ne) { if (ne.x<0||ne.x>=N||ne.y<0||ne.y>=M) return false ; else if (v[ne.x][ne.y]) return false ; else if (m[ne.x][ne.y]== '#' ) return false ; else return true ; } void bfs(node S) { S.t=T;queue<node>Q; Q.push(S);v[S.x][S.y]=T; while (!Q.empty()) { node F = Q.front();Q.pop(); if (F.x==e.x&&F.y==e.y) { ans=F.step; return ; } for ( int i=0;i<4;++i) { node ne=F; ne.x=F.x+dir[i][0],ne.y=F.y+dir[i][1]; if (!Check(ne)) continue ; v[ne.x][ne.y]=1; ne.step++; Q.push(ne); } } } int main() { cin>>N>>M; for ( int i=0;i<N;++i) { cin>>m[i]; for ( int j=0;j<M;++j) { if (m[i][j]== 'S' ) s.x=i,s.y=j; if (m[i][j]== 'T' ) e.x=i,e.y=j; } } bfs(s); cout<<ans<<endl; return 0; } |
6266取石子游戏[博弈论]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include<iostream> #include<stdio.h> #include<math.h> #include<algorithm> using namespace std; int t; bool dfs( int a, int b) //先手 { if ((a%b==0)||(a/b>=2)) return true ; else if (a/b==1) return !dfs(max(b,a-b),min(b,a-b)); //后手 else return false ; } int main() { int a,b; while (~ scanf ( "%d%d" ,&a,&b)&&(a||b)) { if (dfs(max(a,b),min(a,b))) printf ( "win\n" ); else printf ( "lose\n" ); } return 0; } |
666:放苹果[排列组合]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include<iostream> #include<stdio.h> #include<math.h> #include<algorithm> using namespace std; int dfs( int m, int n) { if (m==1 || n==1) return 1; else if (m<n) return dfs(m,m); else if (m==n) return dfs(m,m-1)+1; else if (m>n) return dfs(m-n,n)+dfs(m,n-1); } int main() { int a,b,t; scanf ( "%d" ,&t); while (t--) { scanf ( "%d%d" ,&a,&b); cout<<dfs(a,b)<<endl; } return 0; } |
7084:迷宫问题[优先队列]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<iostream> #include<stdio.h> #include<math.h> #include<queue> #include<cstring> #include<sstream> #define MAX 100 #include<algorithm> using namespace std; int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}}; struct point { int x,y; }; struct node { int x,y,k; point step[MAX]; bool operator < ( const node&a) const { return k>a.k; } }; int m[MAX][MAX]; bool v[MAX][MAX]; bool Check(node s) { if (s.x<0||s.y<0||s.x>=5||s.y>=5) return true ; else if (v[s.x][s.y]) return true ; else if (m[s.x][s.y]) return true ; else return false ; } void Print(node f) { for ( int i=0;i<=f.k;++i) cout<< "(" <<f.step[i].x<< ", " <<f.step[i].y<< ")" <<endl; } void bfs(node s) { priority_queue<node>Q; v[s.x][s.y]=1;s.k=0;s.step[0].x=0,s.step[0].y=0; Q.push(s); while (!Q.empty()) { node f=Q.top();Q.pop(); if (f.x==4&&f.y==4) { Print(f); return ;} for ( int i=0;i<4;++i) { node ne=f; ne.x=f.x+dir[i][0],ne.y=f.y+dir[i][1]; if (Check(ne)) continue ; v[ne.x][ne.y]=1; ne.k=f.k+1; ne.step[ne.k].x=ne.x,ne.step[ne.k].y=ne.y; Q.push(ne); } } } int main() { for ( int i=0;i<5;++i) for ( int j=0;j<5;++j) cin>>m[i][j]; node s; s.x=0,s.y=0; bfs(s); return 0; } |
7218:献给阿尔吉侬的花束[优先队列]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include<iostream> #include<stdio.h> #include<math.h> #include<queue> #include<cstring> #include<sstream> #define MAX 205 #include<algorithm> using namespace std; int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}}; struct node { int x,y,k; bool operator < ( const node&a) const { return k>a.k; } }; int R,C,ans; node S,E; string m[MAX]; bool v[MAX][MAX]; bool Check(node s) { if (s.x<0||s.y<0||s.x>=R||s.y>=C) return true ; else if (v[s.x][s.y]) return true ; else if (m[s.x][s.y]== '#' ) return true ; else return false ; } void bfs(node s) { priority_queue<node>Q; v[s.x][s.y]=1; Q.push(s); while (!Q.empty()) { node f=Q.top();Q.pop(); // cout<<"\t\t>>"<<f.x<<","<<f.y<<endl; if (f.x==E.x&&f.y==E.y) { ans = f.k; return ;} for ( int i=0;i<4;++i) { node ne=f; ne.x=f.x+dir[i][0],ne.y=f.y+dir[i][1]; if (Check(ne)) continue ; v[ne.x][ne.y]=1; ne.k=f.k+1; // cout<<ne.x<<","<<ne.y<<endl; Q.push(ne); } } } int main() { int t; scanf ( "%d" ,&t); while (t--) { cin>>R>>C; memset (v,0, sizeof (v));ans=0; for ( int i =0;i<R;++i) { cin>>m[i]; for ( int j=0;j<C;++j) { if (m[i][j]== 'S' ) S.x=i,S.y=j; if (m[i][j]== 'E' ) E.x=i,E.y=j; } } bfs(S); if (ans==0) cout<< "oop!" <<endl; else cout<<ans<<endl; } return 0; } |
4980:拯救行动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<iostream> #include<queue> #include<string> #include<cstring> #define MAXX 10000 #define MAX 220 using namespace std; int M,N,T,ans=0; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int v[MAX][MAX]; string m[MAX]; struct node { int x,y,step; bool operator < ( const node&a) const { return step>a.step;} }; node s,e; bool Check(node ne) { if (ne.x<0||ne.x>=N||ne.y<0||ne.y>=M) return false ; else if (m[ne.x][ne.y]== '#' ) return false ; else return true ; } void bfs(node S) { priority_queue<node>Q; Q.push(S);m[S.x][S.y]= '#' ; while (!Q.empty()) { node F = Q.top();Q.pop(); for ( int i=0;i<4;++i) { node ne=F; ne.x=F.x+dir[i][0],ne.y=F.y+dir[i][1]; if (!Check(ne)) continue ; ne.step++; if (m[ne.x][ne.y]== '@' ) Q.push(ne); if (m[ne.x][ne.y]== 'x' ) { ne.step++;Q.push(ne);} if (m[ne.x][ne.y]== 'a' ) { ans=ne.step; return ; } m[ne.x][ne.y]= '#' ; } } } int main() { int SS;cin>>SS; while (SS--) { memset (v,0, sizeof (v));ans=0; cin>>N>>M; for ( int i=0;i<N;++i) { cin>>m[i]; for ( int j=0;j<M;++j) { if (m[i][j]== 'r' ) s.x=i,s.y=j; if (m[i][j]== 'a' ) e.x=i,e.y=j; } } bfs(s); if (ans) cout<<ans<<endl; else cout<< "Impossible" <<endl; } return 0; } |
6044:鸣人和佐助
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include<iostream> #include<queue> #include<string> #include<cstring> #define MAXX 10000 #define MAX 205 using namespace std; int M,N,T,ans=-1; int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; int v[MAX][MAX]; string m[MAX]; struct node { int x,y,step,t; }; node s,e; bool Check(node ne) { if (ne.x<0||ne.x>=M||ne.y<0||ne.y>=N) return false ; else if (ne.t<=v[ne.x][ne.y]) return false ; else return true ; } void bfs(node S) { S.t=T;queue<node>Q; Q.push(S);v[S.x][S.y]=T; while (!Q.empty()) { node F = Q.front();Q.pop(); if (F.x==e.x&&F.y==e.y) { ans=F.step; return ; } for ( int i=0;i<4;++i) { node ne=F; ne.x=F.x+dir[i][0],ne.y=F.y+dir[i][1]; if (!Check(ne)) continue ; if (m[ne.x][ne.y]== '#' &&ne.t>0) { ne.t--;ne.step++; v[ne.x][ne.y]=ne.t; Q.push(ne); } else if (m[ne.x][ne.y]== '*' ||m[ne.x][ne.y]== '+' ) { v[ne.x][ne.y]=ne.t; ne.step++; Q.push(ne); } } } } int main() { cin>>M>>N>>T; memset (v,-1, sizeof (v)); for ( int i=0;i<M;++i) { cin>>m[i]; for ( int j=0;j<N;++j) { if (m[i][j]== '@' ) s.x=i,s.y=j; if (m[i][j]== '+' ) e.x=i,e.y=j; } } bfs(s); cout<<ans<<endl; return 0; } |
7834:分成互质组[dfs+涂色]🚩
323:棋盘问题[跟八皇后类似]🚩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include<iostream> #include<string> #include<cstring> #include<stdio.h> #define MAX 100 using namespace std; int n,k,ans; string m[MAX]; int v[MAX]; void dfs( int r, int cs) //第r行,第cs个棋子 { if (n-r<k-cs) return ; dfs(r+1,cs); //这一行放不棋子 for ( int c=0;c<n;++c) //这一行放棋子 { //如果是棋盘区并且没有放过棋子 if (m[r][c]== '#' &&!v[c]) { if (cs==k) { ++ans; } else { v[c]=1; dfs(r+1,cs+1); v[c]=0; } } } } int main() { while (~ scanf ( "%d%d" ,&n,&k)) { if (n==-1&&k==-1) break ; for ( int i=0;i<n;++i)cin>>m[i]; memset (v,0, sizeof (v));ans=0; dfs(0,1); cout<<ans<<endl; } return 0; } |
8783:单词接龙🚩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include<cstdio> #include<string> #include<iostream> #include<algorithm> using namespace std; string a[21]; int n,maxn,used[21],l=1; void dfs( int c) //a[c]已定单词,a[i]接龙单词 { int lc,li; maxn=max(maxn,l); for ( int i=1;i<=n;i++) //遍历一下单词表 if (used[i]<2) for ( int j=0;j<a[c].length();j++) //将已定单词的每一个字母逐一与接龙单词 if (a[c][j]==a[i][0]) //的首字母比较,从相同的地方开始接 { lc=j; li=0; //记录接龙起点 while (a[c][lc]==a[i][li]&&lc<a[c].length()) //逐个比对,如果相同且长度没超过已定单词的长度就累加长度 { lc++; li++; } if (lc==a[c].length()) //如果比对到了,就接上长度(到达目标) { l+=a[i].length()-li; used[i]++; dfs(i); l-=a[i].length()-li; used[i]--; } } } int main() { scanf ( "%d" ,&n); for ( int i=1;i<=n;i++) cin>>a[i]; cin>>a[n+1]; l=a[n+1].length(); dfs(n+1); //把头字母也当成一个单词,从头字母开始搜 printf ( "%d" ,maxn); } |
917:Knight Moves
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<iostream> #include<queue> #include<string> #include<cstring> #define MAX 330 using namespace std; int n,T,m,ans; int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}}; struct node { int x,y,step; bool operator < ( const node&a) const { return step>a.step;} }; int v[MAX][MAX]; node s,e; bool Check(node t) { if (t.x<0||t.x>=n||t.y<0||t.y>=n) return false ; else if (v[t.x][t.y]) return false ; else return true ; } void bfs(node S) { priority_queue<node>Q; v[S.x][S.y]=1; Q.push(S); while (!Q.empty()) { node f=Q.top();Q.pop(); if (f.x==e.x&&f.y==e.y) { ans=f.step; return ; } for ( int i=0;i<8;++i) { node news=f; news.x = f.x+dir[i][0],news.y = f.y+dir[i][1]; if (Check(news)) { v[news.x][news.y]=1; news.step=f.step+1; Q.push(news); } } } } int main() { cin>>T; while (T--) { cin>>n>>s.x>>s.y>>e.x>>e.y;ans=0; memset (v,0, sizeof (v)); if (s.x==e.x&&s.y==e.y) { cout<<0<<endl; } else { bfs(s); cout<<ans<<endl; } } return 0; } |
2152:Pots
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 一个适用于 .NET 的开源整洁架构项目模板
· AI Editor 真的被惊到了
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用