AcWing 1113. 红与黑
原题链接
简单
作者:
咲张熊猫人
,
2021-01-12 10:58:15
,
所有人可见
,
阅读 372
C++ 代码
#include<iostream>
using namespace std;
constexpr int N = 1000; //刚开始写了1e+5 编译不过
int W,H;
char arr[N][N]; //刚开始写了int arr[N][N] 出现段错误
int count = 1; //表示黑色瓷砖数
void fun(int x, int y)
{
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1}; //昨天y总说的那个技巧
int a, b, c = 0; //a,b就是x,y坐标了,c就是个标志量
for(int i = 0; i<4; ++i) //for四次循环分别表示上下左右四个方向能否移动
{
a = x + dx[i], b = y + dy[i]; //偏移量
if(a>=0 && b>=0 && a<H && b<W && arr[a][b] == '.') //判断边界 / 判断是否走过 / 判断是否是黑色瓷砖
{
count++; //黑色瓷砖 ++
arr[a][b] = 'a'; //将其内容改为a,表示这个格子已经走过
fun(a, b); //再次递归遍历其4个方向
}
else
c++; //若四个方向均不能移动 c最终会等于4
}
if(c == 4) return;
}
int main()
{
int x,y;
while(1) //测量多组数组直接写个while1
{
count = 1; //起点也是黑色瓷砖, 故每次初始化为1
cin >> W >> H ;
if(W == 0 && H == 0) break; //输入两个 0 退出循环结束
for(int i = 0; i < H; i++)
for(int j = 0; j < W; j++)
{
cin >> arr[i][j];
if(arr[i][j] == '@') x = i, y = j; //标记起点坐标
}
arr[x][y] = 'a'; //表示起点走过
fun(x, y);
cout<<count<<endl;
}
return 0;
}