题目描述
由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
输入格式
每组测试数据第一行一个整数n(1 \le n \le 30)n(1≤n≤30)
接下来nn行,由00和11组成的n \times nn×n的方阵。
方阵内只有一个闭合圈,圈内至少有一个00。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式
已经填好数字22的完整方阵。
输入输出样例
输入 #1复制
6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1
输出 #1复制
0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1
说明/提示
1 \le n \le 301≤n≤30
1.DFS 代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N=40;
int n;
int map[N][N];
bool st[N][N];
int flag[4];
int px,py;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void dfs(int x,int y)
{
st[x][y]=true;
map[x][y]=2;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=n)
continue;
if(st[xx][yy])
continue;
if(map[xx][yy]==1)
continue;
dfs(xx,yy);
}
}
int main()
{
//int n;
while(cin>>n)
{
memset(st,false,sizeof st);
memset(flag,0,sizeof flag);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
}
}
int flag2=1;
for(int i=0;i<n;i++)
{
if(!flag2)
break;
for(int j=0;j<n;j++)
{
if(!flag2)
break;
if(map[i][j]==0)
for(int k=0;k<n;k++)
{
if(i+k<n&&map[i+k][j]==1)
flag[0]=1;
if(i-k>=0&&map[i-k][j]==1)
flag[1]=1;
if(j+k<n&&map[i][j+k]==1)
flag[2]=1;
if(j-k>=0&&map[i][j-k]==1)
flag[3]=1;
if(flag[0]&&flag[1]&&flag[2]&&flag[3])
{
px=i;
py=j;
flag2=0;
break;
}
}
}
}
dfs(px,py);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<map[i][j]<<" ";
}
cout<<endl;
}
}
}
2.BFS 代码
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
const int N=100;
int mapv[N][N];
bool st[N][N];
int col[N];
int row[N];
int flag[4];
int dirx[4]={-1,0,1,0};
int diry[4]={0,-1,0,1};
int n;
void bfs(int x,int y)
{
queue<PII>q;
st[x][y]=true;
mapv[x][y]=2;
q.push({x,y});
while(!q.empty())
{
PII t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int xx=t.first+dirx[i];
int yy=t.second+diry[i];
if(xx>=0&&xx<n&&yy>=0&&yy<n&&!st[xx][yy]&&mapv[xx][yy]==0)
{
mapv[xx][yy]=2; //BFS虽然用来求最短的路径,但是它也能把所有点遍历到,只不过在这些点中会有一条最短路径
st[xx][yy]=true;
q.push({xx,yy});
}
}
}
}
int main()
{
cin>>n;
int posx,posy;
//int flag=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>mapv[i][j];
/*else if(mapv[i][j]==0&&row[i]>=2&&col[j]>=2&&!flag)
{
posx=i;
posy=j;
printf("%d %d\n",posx,posy);
flag=1;
} */
}
}
int flag2=1;
for(int i=0;i<n;i++)
{
if(!flag2)
break;
for(int j=0;j<n;j++)
{
if(!flag2)
break;
if(mapv[i][j]==0)
{
for(int k=0;k<n;k++)
{
if(i+k<n&&mapv[i+k][j]==1)
flag[0]=1;
if(i-k>=0&&mapv[i-k][j]==1)
flag[1]=1;
if(j+k<n&&mapv[i][j+k]==1)
flag[2]=1;
if(j-k>=0&&mapv[i][j-k]==1)
flag[3]=1;
if(flag[0]&&flag[1]&&flag[2]&&flag[3])
{
posx=i;
posy=j;
flag2=0;
break;
}
}
}
}
}
bfs(posx,posy);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j!=n-1)
cout<<mapv[i][j]<<" ";
else cout<<mapv[i][j];
}
cout<<endl;
}
}