为什么不开O2能AC一开O2就RE加TLE
查看原帖
为什么不开O2能AC一开O2就RE加TLE
446375
zzx2002楼主2021/4/27 12:46

Rt
代码如下

#include <iostream>
#include <cstdlib>
#include <string>
#include <cstdio>
#include<cstring>
using namespace std;
int n, m, room[61][61][4], flag[61][61], s, maxn, ans, xx, yy,roomsize[2600];
char position;
int dfs(int x, int y)
{
    if (flag[x][y]!= 0|| x <= 0 || y <= 0 || x > n || y > m)
    {
        return 0;
    }
    ans++;
    flag[x][y] = s + 1;
    if (room[x][y][0] == 0 && !(flag[x][y+1] != 0 || x <= 0 || y <= 0 || x > n || y > m)) {//east
        dfs(x, y + 1);
    }
    if (room[x][y][1] == 0 && !(flag[x+1][y] != 0 || x <= 0 || y <= 0 || x > n || y > m)) {//south
        dfs(x + 1, y);
    }
    if (room[x][y][2] == 0 && !(flag[x][y - 1] != 0 || x <= 0 || y <= 0 || x > n || y > m)) {//west
        dfs(x, y - 1);
    }
    if (room[x][y][3] == 0 && !(flag[x-1][y] != 0 || x <= 0 || y <= 0 || x > n || y > m)) {//nouth
        dfs(x - 1, y);
    }
}
int main()
{
    cin >> m >> n;
    yy = 10000;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> s;
            if (s & 1) room[i][j][2] = 1;
            if (s & 2) room[i][j][3] = 1;
            if (s & 4) room[i][j][0] = 1;
            if (s & 8) room[i][j][1] = 1;
        }
    }
    s = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++)
        {
            ans = 0;
            if (flag[i][j] == 0) {
                dfs(i, j);
                s++;
                roomsize[s] = ans;
            }
            maxn = max(maxn, ans);
        }
    }
    ans = 0;
    cout << s << endl << maxn << endl;
    int Max = maxn;

    for (int k = 1; k <= m; k++)
    {
        for (int i = n; i > 0; i = i - 1)
        {
            if (flag[i][k] != flag[i - 1][k])//nouth
            {
                if (roomsize[flag[i][k]] + roomsize[flag[i - 1][k]] > Max)
                {
                    xx = i, yy = k;
                    Max = roomsize[flag[i][k]] + roomsize[flag[i - 1][k]];
                    position = 'N';
                }
            }
            if (flag[i][k] != flag[i][k + 1])
            {
                if (roomsize[flag[i][k]] + roomsize[flag[i][k + 1]] > Max)
                {
                    xx = i, yy = k;
                    Max = roomsize[flag[i][k]] + roomsize[flag[i][k + 1]];
                    position = 'E';
                }
            }
        }
    }
    cout << Max << endl << xx << " " << yy << " " << position << endl; //输出
    return 0;
}

2021/4/27 12:46
加载中...