二维数组和坐标系的对应关系

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;
}
posted @ 2024-03-02 15:43  光風霽月  阅读(47)  评论(0编辑  收藏  举报