hdu_1312_红与黑(BFS)使用队列处理
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<string.h> 5 using namespace std; 6 7 struct node 8 { 9 int x,y; 10 }; 11 12 queue<node> q; 13 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 14 char g[25][25]; 15 int w,h,tot;//w:列 h:行 16 17 void bfs() 18 { 19 20 while(!q.empty()) 21 { 22 node a=q.front(); 23 q.pop(); 24 for(int i=0;i<4;i++) 25 { 26 node b; 27 b.x=a.x+dir[i][0]; 28 b.y=a.y+dir[i][1]; //测试cout<<"b.x"<<b.x<<"b.y"<<b.y<<endl; 29 if(b.x>=0&&b.x<h&&b.y>=0&&b.y<w&&g[b.x][b.y]!='#') 30 { 31 g[b.x][b.y]='#'; 32 tot++; 33 q.push(b); 34 } 35 } 36 } 37 } 38 39 int main() 40 { 41 while(scanf("%d%d",&w,&h)!=EOF&&w&&h) 42 { 43 while(!q.empty()) q.pop(); 44 tot=1; 45 node start; 46 for(int i=0;i<h;i++) 47 { 48 for(int j=0;j<w;j++) 49 { 50 cin>>g[i][j]; 51 if(g[i][j]=='@') 52 { 53 start.x=i; 54 start.y=j; 55 g[i][j]='#'; 56 } 57 } 58 char c=getchar(); 59 } 60 q.push(start); 61 bfs(); 62 printf("%d\n",tot); 63 } 64 return 0; 65 }
下面这个错了 有大佬帮忙看一下吗?逻辑是一样的
#include<iostream> #include<queue> using namespace std; char room[23][23]; int dir[4][2]={ {-1,0},{0,-1},{1,0},{0,1} }; int Wx,Hy,num; //#define CHECK(x,y) (x<Wx&&x>=0&&y>=0&&y<Hy) struct node{ int x,y; }; void BFS(int dx,int dy){ num=1; queue<node> q; node start,next; start.x=dx; start.y=dy; q.push(start); while(!q.empty()){ start=q.front(); q.pop(); for(int i=0;i<4;i++){ next.x=start.x+dir[i][0]; next.y=start.y+dir[i][1]; if(next.x<Wx&&next.x>=0&&next.y>=0&&next.y<Hy&&room[next.x][next.y]=='.'){ room[next.x][next.y]=='#'; num++; q.push(next); } } } } int main(){ int x,y,dx,dy; while(cin>>Wx>>Hy){ if(Wx==0&&Hy==0) break; for(x=0;x<Wx;x++){ for(y=0;y<Hy;y++){ cin>>room[x][y]; if(room[x][y]=='@'){ dx=x; dy=y; } } } num=0; BFS(dx,dy); cout<<num<<endl; } return 0; }
队列处理理解:
1入队 {1}
1出队 邻居2.3入队 {2.3}
2出队 邻居4.5.6入队 {3.4.5.6}
3出队 邻居7.8入队 {4.5.6.7.8}
4出队 邻居9入队 {5.6.7.8.9}
以此类推 出一个点 与这个点最近的邻居入队,不得有重复,直到所有点都出去,队列为空。