POJ 1979 - Red and Black

“.”能走,“#”不能走,“@”为起点,求所有能走到的地方。

BFS:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 
 6 int w,h;
 7 int dir[4][2]={{0,+1},{-1,0},{0,-1},{+1,0}};
 8 char t[23][23];
 9 bool vis[23][23];
10 struct type{
11     int x,y;
12 }st,now,next;
13 
14 int bfs()
15 {
16     int cnt=1;
17     queue<type> q;
18     q.push(st);
19     while(!q.empty())
20     {
21         now=q.front();q.pop();
22         for(int i=0;i<4;i++)  
23         {  
24             next.x=now.x+dir[i][0] , next.y=now.y+dir[i][1]; //尝试走一步 
25             if(vis[next.x][next.y]==0) //如果这一步可以走 
26             {
27                 vis[next.x][next.y]=1; //将走过的这块tile标记为1
28                 q.push(next); 
29                 cnt++; //可走的tile计数+1 
30             }
31         }
32     }
33     return cnt;
34 }
35 
36 int main()
37 {
38     while(scanf("%d%d",&w,&h) && (w*h)!=0)
39     { 
40         for(int i=1;i<=h;i++)
41         {
42             scanf("%s",(t[i]+1));
43         }
44         
45         //将地图转化为相应的标记数组,所有不能走的、走过的tile均标记为1(包括边界以外的地方以及起点),能走的tile都标记为0
46         memset(vis,1,sizeof(vis)); 
47         for(int i=1;i<=h;i++)
48         {
49             for(int j=1;j<=w;j++)
50             {
51                 if(t[i][j]=='.') vis[i][j]=0;
52                 if(t[i][j]=='#') vis[i][j]=1;
53                 if(t[i][j]=='@') st.x=i,st.y=j,vis[i][j]=1;
54             }
55         }
56         
57         int ans=bfs();
58         printf("%d\n",ans);
59     }
60 }

 

 
DFS:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 
 6 int w,h;
 7 int dir[4][2]={{0,+1},{-1,0},{0,-1},{+1,0}};
 8 char t[23][23];
 9 bool vis[23][23];
10 struct type{
11     int x,y;
12 }st,next;
13 
14 void dfs(int x,int y,int &ans)
15 {
16     if(vis[x][y]) return; //如果这个tile走过直接退出函数
17     vis[x][y]=1; //把这块tile标记为已走过
18     ans++; //计数+1
19     for(int i=0;i<4;i++)
20     {
21         next.x=x+dir[i][0] , next.y=y+dir[i][1]; //走一步
22         if(next.x >= 1 && next.x <= h && next.y >= 1 && next.y <= w) //如果走的这一步tile在限定的 w * h 范围内就深搜一下
23         {
24             dfs(next.x,next.y,ans);
25         }
26     }
27 }
28 
29 int main()
30 {
31     while(scanf("%d%d",&w,&h) && (w*h)!=0)
32     { 
33         for(int i=1;i<=h;i++)
34         {
35             scanf("%s",(t[i]+1));
36         }
37         
38         for(int i=1;i<=h;i++)
39         {
40             for(int j=1;j<=w;j++)
41             {
42                 if(t[i][j]=='.') vis[i][j]=0;
43                 if(t[i][j]=='#') vis[i][j]=1;
44                 if(t[i][j]=='@') st.x=i,st.y=j,vis[i][j]=0;
45             }
46         }
47         
48         int ans=0;
49         dfs(st.x,st.y,ans);
50         printf("%d\n",ans);
51     }
52 }


 

posted @ 2017-03-20 22:13  Dilthey  阅读(132)  评论(0编辑  收藏  举报