吸氧后#3,#8 WA求助

P1457 [USACO2.1] 城堡 The Castle

稍微改了一下 ```cpp #include<iostream> #include<cstring> using namespace std; int n,m,cnt,ans,maxx = -(1<<30),ans_x,ans_y; char ans_w; bool mp[155][155][5]; bool vis[155][155]; int k[155][155]; int K[1255]; int xx[] = {-1,1,0,0}; int yy[] = {0,0,-1,1}; inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } int sum(int x,int y){ // cout << x << ' ' << y << endl; k[x][y] = cnt; int ret = 0; vis[x][y] = 1; ret ++; if(!mp[x][y][0] && !vis[x][y-1] && x>=1 && x<=n && y-1>=1 && y-1<=m) ret += sum(x,y-1); if(!mp[x][y][1] && !vis[x-1][y] && x-1>=1 && x-1<=n && y>=1 && y<=m) ret += sum(x-1,y); if(!mp[x][y][2] && !vis[x][y+1] && x>=1 && x<=n && y+1>=1 && y+1<=m) ret += sum(x,y+1); if(!mp[x][y][3] && !vis[x+1][y] && x+1>=1 && x+1<=n && y>=1 && y<=m) ret += sum(x+1,y); return ret; } //void dfs(int x,int y){ // if(mp[x][y][0] == 1 && y != 1) //} int main(){ cin >> m >> n; for(int i=1 ; i<=n ; i++){ for(int j=1,x ; j<=m ; j++){ cin >> x; if(x&1) mp[i][j][0] = 1; if(x&2) mp[i][j][1] = 1; if(x&4) mp[i][j][2] = 1; if(x&8) mp[i][j][3] = 1; } } memset(vis,0,sizeof vis); for(int i=1 ; i<=n ; i++){ for(int j=1 ; j<=m ; j++){ if(!vis[i][j]) K[++cnt] = sum(i,j); maxx = max(maxx,K[cnt]); } } cout << cnt << endl << maxx << endl; for(int j=1 ; j<=m ; j++) for(int i=n ; i>=1 ; i--){ if(i != 1 && mp[i][j][1] == 1 && k[i][j] != k[i-1][j]){ if(ans < K[k[i][j]] + K[k[i-1][j]]){ ans = K[k[i][j]] + K[k[i-1][j]]; ans_x = i; ans_y = j; ans_w = 'N'; } } if(j != m && mp[i][j][2] == 1 && k[i][j] != k[i][j+1]){ if(ans < K[k[i][j]] + K[k[i][j+1]]){ ans = K[k[i][j]] + K[k[i][j+1]]; ans_x = i; ans_y = j; ans_w = 'E'; } } } cout << ans << endl << ans_x << ' ' << ans_y << ' ' << ans_w; return 0; } ```
by 黄舀啊 @ 2022-09-06 19:04:40


[记录](https://www.luogu.com.cn/record/86008703)
by 黄舀啊 @ 2022-09-06 19:05:59


加了吸氧A掉了,但为什么换了一下循环就A了 ```cpp for(int i=n ; i>=1 ; i--) for(int j=1 ; j<=m ; j++){ if(i != 1 && mp[i][j][1] == 1 && k[i][j] != k[i-1][j]){ if(ans < K[k[i][j]] + K[k[i-1][j]]){ ans = K[k[i][j]] + K[k[i-1][j]]; ans_x = i; ans_y = j; ans_w = 'N'; } } if(j != m && mp[i][j][2] == 1 && k[i][j] != k[i][j+1]){ if(ans < K[k[i][j]] + K[k[i][j+1]]){ ans = K[k[i][j]] + K[k[i][j+1]]; ans_x = i; ans_y = j; ans_w = 'E'; } } } ``` 换成了 ```cpp for(int j=1 ; j<=m ; j++) for(int i=n ; i>=1 ; i--){ if(i != 1 && mp[i][j][1] == 1 && k[i][j] != k[i-1][j]){ if(ans < K[k[i][j]] + K[k[i-1][j]]){ ans = K[k[i][j]] + K[k[i-1][j]]; ans_x = i; ans_y = j; ans_w = 'N'; } } if(j != m && mp[i][j][2] == 1 && k[i][j] != k[i][j+1]){ if(ans < K[k[i][j]] + K[k[i][j+1]]){ ans = K[k[i][j]] + K[k[i][j+1]]; ans_x = i; ans_y = j; ans_w = 'E'; } } } ```
by 黄舀啊 @ 2022-09-06 19:08:52


@[黄舀啊](/user/496009) 简单实验了一下,仿佛和循环顺序没有关系?吸氧都能 A? 不开 O2 会 RE 的原因可能是 48 ~ 53 行的 `++cnt` 加爆了直接越界,产生 UB
by Poncirus @ 2022-09-06 19:42:18


@[HYp0rItE62](/user/245052) 谢谢dalao
by 黄舀啊 @ 2022-09-07 18:13:02


蒟蒻请教一下,什么叫做吸氧
by Wallacewwz @ 2023-09-24 21:31:22


|