32分对两个 大佬们棒棒蒟蒻有注释

P1162 填涂颜色

这道题用DFS会好做一点以下是我的代码仅供参考@[1875311061hsy](/user/1059776) (虽用处不大但还是厚着脸皮求一关) ``` #include<bits/stdc++.h> using namespace std; int n; int vis[4][2]={-1,0,1,0,0,-1,0,1}; int arr[31][31]; void dfs(int x,int y){ for(int i=0;i<4;i++){ int xx=x+vis[i][0]; int yy=y+vis[i][1]; if(xx>=1 && xx<=n && yy>=1 && yy<=n && arr[xx][yy]==0){ arr[xx][yy]=2; dfs(xx,yy); } } } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>arr[i][j]; } } for(int i=1;i<=n;i++){ if(arr[i][1]==0){ dfs(i,1); } if(arr[1][i]==0){ dfs(1,i); } if(arr[n][i]==0){ dfs(n,i); } if(arr[i][n]==0){ dfs(i,n); } } for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ if(arr[i][j]==2){ arr[i][j]=0; } else if(arr[i][j]==0){ arr[i][j]=2; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<arr[i][j]<<" "; } cout<<endl; } return 0; } ```
by liu_le_chen @ 2023-08-27 18:48:13


@[1875311061hsy](/user/1059776) 可以把数据下载下来,特判一下(bushi)
by _Adolf_Hitler_ @ 2023-08-27 18:56:12


@[JODAN_POOLE](/user/931106) 我今天的用过了第一个是对的后我想不出啥情况没考虑了
by HSyuio77 @ 2023-08-27 19:02:09


@[liulechen](/user/1037273) 有点咩看懂我的代码意思就是先把0变成2然后再把边上的2变成0
by HSyuio77 @ 2023-08-27 19:08:32


对呀我就是这样的呀,用DFS来实现
by liu_le_chen @ 2023-08-27 19:11:54


@[1875311061hsy](/user/1059776)
by liu_le_chen @ 2023-08-27 19:12:10


@liulechenoo哦看懂你的了但我不知道我的错哪里了只对了一半```cpp #include<iostream> #include<cstring> #include<algorithm> using namespace std; int a[31][31]; int n; void sou0(int i,int j)//把2涂成0 { a[i][j]=0; if(i<1||i>n||j<1||j>n) { return; } if(a[i+1][j]==2) { sou0(i+1,j); } if(a[i-1][j]==2) { sou0(i-1,j); } if(a[i][j-1]==2) { sou0(i,j-1); } if(a[i][j+1]==2) { sou0(i,j+1); } } void sou(int i,int j)//0涂成2 { a[i][j]=2; if(i<1||i>n||j<1||j>n) { return; } if(a[i+1][j]==0) { sou(i+1,j); } if(a[i-1][j]==0) { sou(i-1,j); } if(a[i][j-1]==0) { sou(i,j-1); } if(a[i][j+1]==0) { sou(i,j+1); } } int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]==0) { sou(i,j);//将所以0涂成2 } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if((j==1||j==n)&&(i==1||i==n)) { if(a[i][j]==2) { sou0(i,j);//将边界2涂成0 } } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cout<<a[i][j]<<" "; } cout<<endl; } return 0; } ```
by HSyuio77 @ 2023-08-27 19:28:20


|