bfs/无向图的最短路径算法
uva,572
简单dfs题目。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 6 using namespace std; 7 const int maxn=105; 8 9 char map[maxn][maxn]; 10 int vis[maxn][maxn]; 11 int n,m; 12 int dx[]={-1,0,-1,-1,0,1,1,1},dy[]={-1,-1,0,1,1,-1,0,1}; 13 14 bool check(int x,int y) 15 { 16 if(x<0 || x>=m || y<0 || y>=n) return false; 17 if(vis[x][y]) return false; 18 if(map[x][y]!='@') return false; 19 return true; 20 } 21 22 void dfs(int x,int y) 23 { 24 int xx,yy; 25 vis[x][y]=1; 26 map[x][y]='#'; 27 for(int i=0;i<8;i++) 28 { 29 xx=x+dx[i]; 30 yy=y+dy[i]; 31 if(check(xx,yy)) 32 { 33 dfs(xx,yy); 34 } 35 } 36 37 } 38 39 40 int main() 41 { 42 while(scanf("%d %d",&m,&n) && n+m) 43 { 44 memset(map,0,sizeof(map)); 45 for(int i=0;i<m;i++) 46 scanf("%s",map[i]); 47 48 memset(vis,0,sizeof(vis)); 49 int cnt=0; 50 for(int i=0;i<m;i++) 51 for(int j=0;j<n;j++) 52 { 53 if(!vis[i][j] && map[i][j]=='@') 54 { 55 dfs(i,j); 56 cnt++; 57 } 58 } 59 printf("%d\n",cnt); 60 } 61 return 0; 62 }
uva,439
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 struct Node 8 { 9 int x,y; 10 int bu; 11 }q[11111]; 12 13 int dx[]={1,1,-1,-1,2,2,-2,-2},dy[]={2,-2,2,-2,1,-1,1,-1}; 14 int vis[15][15]; 15 int x,y,xx,yy; 16 char a[3],b[3]; 17 int cnt; 18 19 20 bool check(int x,int y) 21 { 22 if(x<1 || x>8 || y<1 || y>8) return false; 23 if(vis[x][y]) return false; 24 return true; 25 } 26 27 void bfs(int x,int y) 28 { 29 int head=0,tail=0; 30 q[head].x=x; 31 q[head++].y=y; 32 vis[x][y]=1; 33 for(int i=0;i<11111;i++) 34 q[i].bu=9999; 35 q[tail].bu=0; 36 while(tail!=head) 37 { 38 Node t=q[tail++]; 39 Node tt; 40 for(int i=0;i<8;i++) 41 { 42 tt.x=t.x+dx[i]; 43 tt.y=t.y+dy[i]; 44 if(tt.x==xx && tt.y==yy) 45 { 46 cnt=t.bu+1; 47 return; 48 } 49 if(check(tt.x,tt.y)) 50 { 51 vis[tt.x][tt.y]=1; 52 tt.bu=t.bu+1; //应该是求深度。。我一开始直接弄一个cnt++ 53 //弄成求附近有多少步了。。wa了两次 54 q[head++]=tt; 55 } 56 } 57 } 58 } 59 60 int main() 61 { 62 while(~scanf("%s%s",a, b)) 63 { 64 x=a[0]-'a'+1; 65 y=a[1]-'0'; 66 xx=b[0]-'a'+1; 67 yy=b[1]-'0'; 68 cnt=0; 69 if(x==xx && y==yy) 70 printf("To get from %s to %s takes 0 knight moves.\n",a,b); 71 else 72 { 73 memset(q,0,sizeof(q)); 74 memset(vis,0,sizeof(vis)); 75 bfs(x,y); 76 printf("To get from %s to %s takes %d knight moves.\n",a,b,cnt); 77 } 78 } 79 return 0; 80 }
uva,417
注意dfs递归打表,方法好巧妙= =忍不住多写了几遍
- -再写一遍;
void dfs(int s,int n,int t)
{
if(n==t)
{
for(int i=0;i<t;i++)
answ[Count][i]=save[i];
answ[Count++][t]=0;
}
else
{
for(int i=s;i<26;i++)
{
if(!used[i])
{
used[i]=1;
save[n]='a'+i;
dfs(i+1,n+1,t);
used[i]=0;
}
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <map> 5 #include <cstdio> 6 7 using namespace std; 8 9 int used[26]; 10 char save[6],data[6]; 11 char answ[83685][6]; 12 int Count=0; 13 map<string,int> mp; 14 15 void dfs(int s,int n,int t) 16 { 17 if(n==t) 18 { 19 for(int i=0;i<t;i++) 20 answ[Count][i]=save[i]; 21 answ[Count++][t]=0; 22 } 23 else 24 { 25 for(int i=s;i<26;i++) 26 { 27 if(!used[i]) 28 { 29 used[i]=1; 30 save[n]=i+'a'; 31 dfs(i+1,n+1,t); 32 used[i]=0; 33 } 34 } 35 } 36 } 37 38 int main() 39 { 40 Count=1; 41 for(int i=1;i<6;i++) 42 dfs(0,0,i); 43 for(int i=1;i<Count;++i) 44 { 45 string s=answ[i]; 46 mp[s]=i; 47 } 48 while(cin>>data) 49 { 50 cout<<mp[data]<<endl; 51 } 52 return 0; 53 }
uva,352
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 6 using namespace std; 7 const int maxn=105; 8 9 char map[maxn][maxn]; 10 int vis[maxn][maxn]; 11 int n; 12 int dx[]={-1,0,-1,-1,0,1,1,1},dy[]={-1,-1,0,1,1,-1,0,1}; 13 14 bool check(int x,int y) 15 { 16 if(x<0 || x>=n || y<0 || y>=n) return false; 17 if(vis[x][y]) return false; 18 if(map[x][y]!='1') return false; 19 return true; 20 } 21 22 void dfs(int x,int y) 23 { 24 int xx,yy; 25 vis[x][y]=1; 26 map[x][y]=0; //记得标记 27 for(int i=0;i<8;i++) 28 { 29 xx=x+dx[i]; 30 yy=y+dy[i]; 31 if(check(xx,yy)) 32 { 33 dfs(xx,yy); 34 } 35 } 36 37 } 38 39 40 int main() 41 { 42 int test=1; 43 while(~scanf("%d",&n) && n) 44 { 45 memset(map,0,sizeof(map)); 46 for(int i=0;i<n;i++) 47 scanf("%s",map[i]); 48 49 memset(vis,0,sizeof(vis)); 50 int cnt=0; 51 for(int i=0;i<n;i++) 52 for(int j=0;j<n;j++) 53 { 54 if(!vis[i][j] && map[i][j]=='1') 55 { 56 dfs(i,j); 57 cnt++; 58 } 59 } 60 printf("Image number %d contains %d war eagles.\n",test++,cnt); 61 } 62 return 0; 63 }
uva,336
一开始一根筋想用dfs解出来,因为就30个点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <map> 5 #include <vector> 6 #include <algorithm> 7 #include <cmath> 8 #include <queue> 9 using namespace std; 10 11 vector<int> vt[32]; 12 map<int,int> mp; 13 int dis[32]; 14 15 void dfs(int node,int dp) 16 { 17 if(!dp) 18 return; 19 for(int i=0;i<vt[node].size();i++) 20 { 21 if(!dis[vt[node][i]]) 22 { 23 dis[vt[node][i]]=1; 24 dfs(vt[node][i],dp-1); 25 } 26 } 27 } 28 29 30 int main() 31 { 32 int nc; 33 int x,y,c; 34 int st; 35 int t=1; 36 int cnt; 37 int strt,ttl; 38 while(scanf("%d",&nc) && nc) 39 { 40 int a,b; 41 mp.clear(); 42 c=0; 43 for(int i=0;i<nc;i++) 44 { 45 scanf("%d %d",&a,&b); 46 if(mp.find(a)!=mp.end()) 47 x=mp[a]; 48 else 49 { 50 mp[a]=++c; 51 x=c; 52 } 53 if(mp.find(b)!=mp.end()) 54 y=mp[b]; 55 else 56 { 57 mp[b]=++c; 58 y=c; 59 } 60 vt[x].push_back(y); 61 vt[y].push_back(x); 62 } 63 64 while(scanf("%d %d",&strt,&ttl) && strt+ttl) 65 { 66 memset(dis,0,sizeof(dis)); 67 st=mp[strt]; 68 cnt=0; 69 dis[st]=1; 70 dfs(st,ttl); 71 for(int i=1;i<=c;i++) 72 { 73 if(!dis[i]) 74 cnt++; 75 } 76 printf("Case %d: %d nodes not reachable from node %d with TTL = %d.\n",t++,cnt,strt,ttl); 77 } 78 for(int i=1;i<=c;i++) 79 vt[i].clear(); 80 } 81 return 0; 82 }
用bfs重写了,把每个节点的深度打表,没有访问到的节点和深度大于给定节点的都是不可达的。
map映射感觉写的好赞
搜点具体那个点到点用dfs,铺面用bfs做
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <map> 5 #include <vector> 6 #include <algorithm> 7 #include <cmath> 8 #include <queue> 9 using namespace std; 10 11 vector<int> vt[32]; 12 map<int,int> mp; 13 int dis[32]; 14 queue<int> q; 15 16 void bfs() 17 { 18 int node; 19 while(!q.empty()) 20 { 21 node=q.front(); 22 q.pop(); 23 24 for(int i=0;i<vt[node].size();i++) 25 { 26 if(dis[vt[node][i]]==-1) 27 { 28 dis[vt[node][i]]=dis[node]+1; 29 q.push(vt[node][i]); 30 } 31 } 32 } 33 return; 34 } 35 36 37 int main() 38 { 39 int nc; 40 int x,y,c; 41 int st; 42 int t=1; 43 int cnt; 44 int strt,ttl; 45 while(scanf("%d",&nc) && nc) 46 { 47 int a,b; 48 mp.clear(); 49 c=0; 50 for(int i=0;i<nc;i++) 51 { 52 scanf("%d %d",&a,&b); 53 if(mp.find(a)!=mp.end()) 54 x=mp[a]; 55 else 56 { 57 mp[a]=++c; 58 x=c; 59 } 60 if(mp.find(b)!=mp.end()) 61 y=mp[b]; 62 else 63 { 64 mp[b]=++c; 65 y=c; 66 } 67 vt[x].push_back(y); 68 vt[y].push_back(x); 69 } 70 71 while(scanf("%d %d",&strt,&ttl) && strt+ttl) 72 { 73 memset(dis,-1,sizeof(dis)); 74 st=mp[strt]; 75 cnt=0; 76 dis[st]=0; 77 q.push(st); 78 bfs(); 79 for(int i=1;i<=c;i++) 80 { 81 if(dis[i]==-1 || dis[i]>ttl) 82 cnt++; 83 } 84 printf("Case %d: %d nodes not reachable from node %d with TTL = %d.\n",t++,cnt,strt,ttl); 85 } 86 for(int i=1;i<=c;i++) 87 vt[i].clear(); 88 } 89 return 0; 90 }
uva,532
挺简单的bfs题目,只是有几个点该注意
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 struct Node 7 { 8 int x,y,z; 9 }q[30000]; //注意数组越界 10 11 int dxyz[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; 12 13 char map[32][32][32]; 14 int L,R,C; 15 int x2,y2,z2; 16 int x1,y1,z1; 17 int vis[32][32][32]; 18 int dir[32][32][32]; 19 bool flag; 20 21 bool check(int x,int y,int z) 22 { 23 if(x<0 || x>=L || y<0 || y>=R || z<0 || z>=C) return false; 24 if(vis[x][y][z]) return false; 25 if(map[x][y][z]!='.') return false; 26 return true; 27 } 28 29 30 void bfs(int x,int y,int z) 31 { 32 int tail=0,head=0; 33 q[head].x=x; 34 q[head].y=y; 35 q[head++].z=z; 36 vis[0][0][0]=1; 37 while(tail!=head) 38 { 39 Node t=q[tail++]; 40 Node tt; 41 for(int i=0;i<6;i++) 42 { 43 tt.x=t.x+dxyz[i][0]; 44 tt.y=t.y+dxyz[i][1]; 45 tt.z=t.z+dxyz[i][2]; 46 if(tt.x==x2 && tt.y==y2 && tt.z==z2) 47 { 48 dir[tt.x][tt.y][tt.z]=dir[t.x][t.y][t.z]+1; 49 flag=true; 50 return; 51 } 52 if(check(tt.x,tt.y,tt.z)) 53 { 54 dir[tt.x][tt.y][tt.z]=dir[t.x][t.y][t.z]+1; 55 vis[tt.x][tt.y][tt.z]=1; 56 q[head++]=tt; 57 } 58 } 59 } 60 } 61 62 int main() 63 { 64 while(scanf("%d %d %d",&L,&R,&C) && L+R+C) 65 { 66 getchar(); 67 memset(map,0,sizeof(map)); 68 for(int i=0;i<L;i++) 69 { 70 for(int j=0;j<R;j++) 71 { 72 scanf("%s",map[i][j]); 73 for(int k=0;k<C;k++) 74 { 75 if(map[i][j][k]=='S') //纪录起点,wa了几次。 76 { 77 x1=i; 78 y1=j; 79 z1=k; 80 } 81 if(map[i][j][k]=='E') //纪录终点,runtime error了几次 82 { 83 x2=i; 84 y2=j; 85 z2=k; 86 } 87 } 88 } 89 getchar(); 90 } 91 memset(vis,0,sizeof(vis)); 92 memset(dir,0,sizeof(dir)); 93 flag=false; 94 bfs(x1,y1,z1); 95 if(flag) 96 printf("Escaped in %d minute(s).\n",dir[x2][y2][z2]); 97 else 98 printf("Trapped!\n"); 99 } 100 return 0; 101 }
活在现实,做在梦里。