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}

以此类推 出一个点 与这个点最近的邻居入队,不得有重复,直到所有点都出去,队列为空。

posted @ 2020-05-29 21:22  一只蒟蒻也有大佬梦  阅读(194)  评论(0编辑  收藏  举报