我是靠谱客的博主 虚心硬币,最近开发中收集的这篇文章主要介绍AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】一、题目链接二、题目分析三、AC代码四、其它题解,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
AcWing 1113. 红与黑
- 一、题目链接
- 二、题目分析
- (一)算法标签
- (二)解题思路
- 三、AC代码
- 解法一(BFS):
- 解法二(DFS):
- 四、其它题解
一、题目链接
AcWing 1113. 红与黑
二、题目分析
(一)算法标签
DFS Flood Fill BFS
(二)解题思路
本题可以用BFS和DFS
输入小trick:
int m, n;
while (cin >> m >> n, m || n)
{
}
详细了解搜索类题目(DFS、BFS),请移步DFS BFS 搜索题目归纳
三、AC代码
解法一(BFS):
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 25;
char g[N][N];
bool st[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int bfs(PII start)
{
memset(st, false, sizeof st);
// 当前点遍历过
st[start.x][start.y] = true;
// 当前点也是黑色
int cnt = 1;
queue<PII> q;
q.push(start);
while (!q.empty())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 4; i ++ )
{
int x = t.x + dx[i], y = t.y + dy[i];
if (x < 0 || x >= n || y < 0 || y >= m) continue;
if (g[x][y] == '.' && !st[x][y])
{
cnt ++ ;
st[x][y] = true;
q.push({x, y});
}
}
}
return cnt;
}
int main()
{
while (true)
{
cin >> m >> n;
if (m == 0) break;
for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);
PII start;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
if (g[i][j] == '@')
{
start = {i, j};
break;
}
cout << bfs(start) << endl;
}
return 0;
}
解法二(DFS):
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 25;
char g[N][N];
bool st[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dfs(int x, int y)
{
int cnt = 1;
st[x][y] = true;
for (int i = 0; i < 4; i ++ )
{
int a = x + dx[i], b = y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m) continue;
if (!st[a][b] && g[a][b] == '.')
{
cnt += dfs(a, b);
}
}
return cnt;
}
int main()
{
while (true)
{
cin >> m >> n;
if (m == 0) break;
for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);
int x, y;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
if (g[i][j] == '@')
{
x = i, y = j;
break;
}
memset(st, false, sizeof st);
cout << dfs(x, y) << endl;
}
return 0;
}
DFS的另一种写法:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 25;
char g[N][N];
bool st[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
// 另一种dfs写法
int ans;
void dfs(int x, int y)
{
// 如果跑出图了就返回
if (x < 0 || x >= n || y < 0 || y >= m) return;
// 标记当前点已经搜索过
st[x][y] = true;
// 每跑一次dfs就代表进来一个新的没跑过的黑格子,所以答案要加一
ans ++ ;
for (int i = 0; i < 4; i ++ )
{
int a = x + dx[i], b = y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m) continue;
if (!st[a][b] && g[a][b] == '.')
{
dfs(a, b);
}
}
}
int main()
{
while (true)
{
cin >> m >> n;
if (m == 0) break;
for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);
int x, y;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
if (g[i][j] == '@')
{
x = i, y = j;
break;
}
memset(st, false, sizeof st);
ans = 0;
dfs(x, y);
cout << ans << endl;
}
return 0;
}
四、其它题解
AcWing 1113. 红与黑
最后
以上就是虚心硬币为你收集整理的AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】一、题目链接二、题目分析三、AC代码四、其它题解的全部内容,希望文章能够帮你解决AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】一、题目链接二、题目分析三、AC代码四、其它题解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复