题目链接
城堡问题
这题需要你在二维数组上建立坐标系,并找出上下作用分别对应\((x,y)\)的变化关系。
对应关系
-----------> y
|
|
|
\/
x
Code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 60;
typedef pair<int, int> PII;
int n, m;
int w[N][N];
bool st[N][N];
// 1表示西墙,2表示北墙,4表示东墙,8表示南墙
// x垂直
int dx[4] = {0, -1, 0, 1}; // 分别对应 西 北 东 南
int dy[4] = {-1, 0, 1, 0};
int cnt, maxn;
int dfs(int fx, int fy)
{
queue<PII> q;
q.push({fx, fy});
st[fx][fy] = true;
int sum = 1;
while(q.size())
{
auto [a, b] = q.front(); q.pop();
for(int i = 0; i < 4; i ++ ) // 2^0 2^1 2^2 2^3
{
int x = a + dx[i], y = b + dy[i];
if(x < 0 || x >= n || y < 0 || y >= m || st[x][y]) continue; // 越界 or 已经访问过
if(w[a][b] >> i & 1) continue; // 有墙
q.push({x, y});
st[x][y] = true;
sum ++ ;
}
}
return sum;
}
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++ )
for(int j = 0; j < m; j ++ )
cin >> w[i][j];
for(int i = 0; i < n; i ++ )
for(int j = 0; j < m; j ++ )
if(!st[i][j])
{
maxn = max(maxn, dfs(i, j));
cnt ++ ;
}
cout << cnt << endl << maxn << endl;
return 0;
}
标签:int,sum,st,++,二维,maxn,数组,include,坐标系
From: https://www.cnblogs.com/ALaterStart/p/18048719