HSyuio77 @ 2023-08-27 18:40:21
#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 liu_le_chen @ 2023-08-27 18:48:13
这道题用DFS会好做一点以下是我的代码仅供参考@1875311061hsy (虽用处不大但还是厚着脸皮求一关)
#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 _Adolf_Hitler_ @ 2023-08-27 18:56:12
@1875311061hsy 可以把数据下载下来,特判一下(bushi)
by HSyuio77 @ 2023-08-27 19:02:09
@JODAN_POOLE 我今天的用过了第一个是对的后我想不出啥情况没考虑了
by HSyuio77 @ 2023-08-27 19:08:32
@liulechen 有点咩看懂我的代码意思就是先把0变成2然后再把边上的2变成0
by liu_le_chen @ 2023-08-27 19:11:54
对呀我就是这样的呀,用DFS来实现
by liu_le_chen @ 2023-08-27 19:12:10
@1875311061hsy
by HSyuio77 @ 2023-08-27 19:28:20
@liulechenoo哦看懂你的了但我不知道我的错哪里了只对了一半```cpp
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;
}