二维数组和坐标系的对应关系
1. 题目链接
城堡问题:这题需要你在二维数组上建立坐标系,并找出上下作用分别对应\((x,y)\)的变化关系。
2. 对应关系(default)
-------> y
|
|
\/
x
3. QA
当然,这个对应关系并不是死的,\(x\) 和 \(y\) 只不过是符号而已,下面的对应关系也没错
------> x
|
|
\/
y
只不过,我们一般用的时候,是将 \(x\) 放在第一维,\(y\) 放在第二维,即 arr[x][y]
,而不会 arr[y][x]
, 因此第一种方式更符合直觉。
如果非要使用第二种方式,需要将下面代码的
// x垂直
int dx[4] = {0, -1, 0, 1}; // 分别对应 西 北 东 南
int dy[4] = {-1, 0, 1, 0};
int x = a + dx[i], y = b + dy[i];`
改为
// 水平x
int dx[4] = {-1, 0, 1, 0}; // 分别对应 西 北 东 南
int dy[4] = {0, -1, 0, 1};
int x = a + dy[i], y = b + dx[i];
4. 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;
}