acwing-红与黑(dfs和bfs两个版本)

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。

你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式

输入包括多个数据集合。

每个数据集合的第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。

在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下

1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

输出格式

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

数据范围

1W,H201≤W,H≤20

输入样例:

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

输出样例:

45
dfs版本
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 const int N=20;
 8 
 9 int n,m;
10 char g[N][N];
11 int dist[N][N];
12 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
13 
14 
15 int dfs(int x,int y)
16 {
17     int cnt=1;
18     
19     dist[x][y]=1;
20     
21     for(int i=0;i<4;i++)
22     {
23         int a=x+dx[i],b=y+dy[i];
24         if(a<0||a>=n||b<0||b>=m) continue;
25         if(g[a][b]!='.') continue;
26         if(dist[a][b]) continue;
27         
28         cnt+=dfs(a,b);
29     }
30     return cnt;
31 }
32 
33 int main()
34 {
35     while(cin>>m>>n,n||m)
36     {
37         int x,y;
38         for(int i=0;i<n;i++) cin>>g[i];
39         
40         for(int i=0;i<n;i++)
41             for(int j=0;j<m;j++)
42             {
43                 if(g[i][j]=='@')
44                 {
45                     x=i;
46                     y=j;
47                     break;
48                 }
49             }
50         memset(dist,0,sizeof dist);   
51         cout<<dfs(x,y)<<endl;
52         
53     }
54     return 0;
55 }

BFS版本


 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 using namespace std;
 7 
 8 typedef pair<int,int> PII;
 9 
10 const int N=20;
11 
12 int n,m;
13 char g[N][N];
14 int dist[N][N];
15 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
16 
17 int bfs(int x,int y)
18 {
19    int cnt = 1; 
20    queue<PII> q;
21    dist[x][y]=1;
22    
23    q.push({x,y});
24    while(q.size())
25    {
26        auto t = q.front();
27        q.pop();
28        int x=t.first,y=t.second;
29        for(int i=0;i<4;i++)
30        {
31            int a=x+dx[i],b=y+dy[i];
32            if(a<0||a>=n||b<0||b>=m) continue;
33            if(g[a][b]!='.') continue;
34            if(dist[a][b]) continue;
35            dist[a][b]=1;
36            q.push({a,b});
37            cnt++;
38        }
39    }
40    return cnt;
41 }
42 
43 int main()
44 {
45     while(cin>>m>>n,n||m)
46     {
47         int x,y;
48         for(int i=0;i<n;i++) cin>>g[i];
49         
50         for(int i=0;i<n;i++)
51             for(int j=0;j<m;j++)
52             {
53                 if(g[i][j]=='@')
54                 {
55                     x=i;
56                     y=j;
57                     break;
58                 }
59             }
60         memset(dist,0,sizeof dist);   
61         cout<<bfs(x,y)<<endl;
62         
63     }
64     return 0;
65 }

 


posted @ 2022-02-24 15:16  不想做混子的奋斗远  阅读(53)  评论(0)    收藏  举报