Red and Black (找到一个标记一个)

题目链接:http://poj.org/problem?id=1979

 

题目大意:

有一个长方形的房间,上面铺着正方形的瓷砖。每块瓷砖都是红色或黑色的。一个男人站在一块黑色的瓷砖上。从一个瓦片,他可以移动到四个相邻瓦片中的一个。但是他不能在红瓦上移动,他只能在黑瓦上移动。

 

编写一个程序,通过重复上面描述的动作来计算他可以到达的黑色方块的数量。

输入

输入由多个数据集组成。数据集以包含两个正整数W和H的行开始;W和H分别是x和y方向上的瓦片数。W和H不超过20。

'.——一块黑瓷砖

“#”——红色瓷砖

@——一个男人在黑色的平铺上(数据集中只出现一次)

 

思路:

找到起始位置然后进行 dfs,找到一个就标记一个,然后一直走下去

一开始自己想错了,我以为是找最多的可以走的。但是后来感觉根据题目的意思来看就是找到一条路就可以了。哭泣

 

AC代码:

 1 #include <cstdio>
 2 #include <string>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <string.h>
 6 #include <math.h>
 7 #include <vector>
 8 
 9 using namespace std;
10 
11 const int maxn = 30;
12 
13 char ss[maxn][maxn];
14 int mx[] = {0,0,1,-1};
15 int my[] = {1,-1,0,0};
16 int vis[maxn][maxn];
17 int n,m;
18 int cnt = 0;
19 
20 bool check(int i,int j)
21 {
22     if (ss[i][j] == '.' && !vis[i][j])
23         return true;
24     return false;
25 }
26 
27 void dfs(int row,int col)
28 {
29     for (int i=0;i<4;i++)
30     {
31         int nx = row + mx[i];
32         int ny = col + my[i];
33         if (check(nx,ny))
34         {
35             cnt++;
36             vis[nx][ny] = 1;
37             dfs(nx,ny);
38         }
39     }
40 
41 }
42 
43 
44 int main() {
45     while (cin >> m >> n) {
46         if (m == 0 && n == 0)
47             return 0;
48         bool flag = false;
49         cnt = 0;
50         memset(vis,0, sizeof(vis));
51         memset(ss,'#', sizeof(ss));
52         for (int i = 1; i <= n; i++) {
53             for (int j = 1; j <= m; j++) {
54                 cin >> ss[i][j];
55             }
56         }
57         for (int i = 1; i <= n; i++) {
58             for (int j = 1; j <= m; j++) {
59                 if (ss[i][j] == '@') {
60                     dfs(i, j);
61                     printf("%d\n", cnt + 1);
62                     flag = true;
63                     break;
64                 }
65             }
66             if (flag)
67                 break;
68         }
69     }
70 }

 

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1147155次浏览 17113人参与
# 通信和硬件还有转码的必要吗 #
11074次浏览 101人参与
# OPPO开奖 #
18822次浏览 264人参与
# 和牛牛一起刷题打卡 #
18514次浏览 1619人参与
# 实习与准备秋招该如何平衡 #
202949次浏览 3619人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4753次浏览 29人参与
# 不去互联网可以去金融科技 #
19340次浏览 247人参与
# 通信硬件薪资爆料 #
265410次浏览 2482人参与
# 国企是理工四大天坑的最好选择吗 #
2158次浏览 34人参与
# 互联网公司评价 #
97476次浏览 1277人参与
# 简历无回复,你会继续海投还是优化再投? #
24996次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454424次浏览 5121人参与
# 国企和大厂硬件兄弟怎么选? #
53796次浏览 1010人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14615次浏览 349人参与
# 硬件人的简历怎么写 #
82249次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19360次浏览 212人参与
# 你见过最离谱的招聘要求是什么? #
27462次浏览 246人参与
# 学历对求职的影响 #
161059次浏览 1804人参与
# 你收到了团子的OC了吗 #
538168次浏览 6382人参与
# 你已经投递多少份简历了 #
343784次浏览 4960人参与
# 实习生应该准时下班吗 #
96829次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63469次浏览 620人参与
牛客网
牛客企业服务