华师一附中OI组
标题:
P1162 填涂颜色
[打印本页]
作者:
admin
时间:
2018-6-29 17:20
标题:
P1162 填涂颜色
https://www.luogu.org/problemnew/show/P1162
题目描述
由数字 0组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 构成,围圈时只走上下左右 4 个方向。现要求把闭合圈内的所有空间都填写成 2.例如: 6×6 的方阵( n=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≤n≤30)
接下来 n 行,由 0和 1 组成的 n×n 的方阵。
方阵内只有一个闭合圈,圈内至少有一个 0 。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式:
已经填好数字 2 的完整方阵。
输入输出样例
输入样例#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≤n≤30
作者:
倚窗倾听风吹雨
时间:
2018-8-20 10:09
#include<iostream>
using namespace std;
int n,a[32][32],er;
bool k[32][32];
struct node
{
int r,c;
}b[1000000];
bool visit[32][32];
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])continue;
int head=0,tail=1;
b[head].r=i;
b[head].c=j;
visit[i][j]=1;
k[i][j]=1;
while(head<tail)
{
if(b[head].r==0 || b[head].c==0 || b[head].r==n+1 || b[head].c==n+1)
{
for(int i=0;i<=n+1;i++)
for(int j=0;j<=n+1;j++)
{
k[i][j]=0;
visit[i][j]=0;
}
break;
}
if(!a[b[head].r+1][b[head].c] && !visit[b[head].r+1][b[head].c])
{
b[tail].r=b[head].r+1;
b[tail].c=b[head].c;
k[b[head].r+1][b[head].c]=1;
visit[b[head].r+1][b[head].c]=1;
tail++;
}
if(!a[b[head].r][b[head].c+1] && !visit[b[head].r][b[head].c+1])
{
b[tail].r=b[head].r;
b[tail].c=b[head].c+1;
k[b[head].r][b[head].c+1]=1;
visit[b[head].r][b[head].c+1]=1;
tail++;
}
if(!a[b[head].r][b[head].c-1] && !visit[b[head].r][b[head].c-1])
{
b[tail].r=b[head].r;
b[tail].c=b[head].c-1;
k[b[head].r][b[head].c-1]=1;
visit[b[head].r][b[head].c-1]=1;
tail++;
}
if(!a[b[head].r-1][b[head].c] && !visit[b[head].r-1][b[head].c])
{
b[tail].r=b[head].r-1;
b[tail].c=b[head].c;
visit[b[head].r-1][b[head].c]=1;
k[b[head].r-1][b[head].c]=1;
tail++;
}
head++;
}
if(head==tail)
{
for(int l=1;l<=n;l++)
{
for(int m=1;m<=n;m++)
if(k[l][m])cout<<"2 ";
else cout<<a[l][m]<<" ";
cout<<endl;
}
return 0;
}
}
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-8-28 22:45
#include<iostream>
using namespace std;
int a[31][31];
int n,x,y;
void dfs(int x,int y)
{
a[x][y]=2;
if(!a[x][y+1])dfs(x,y+1);
if(!a[x+1][y])dfs(x+1,y);
if(!a[x][y-1])dfs(x,y-1);
if(!a[x-1][y])dfs(x-1,y);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
if(!x&&!y&&a[i][j]==1)x=i,y=j;
}
dfs(x+1,y+1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)cout<<a[i][j]<<' ';
cout<<endl;
}
return 0;
}
复制代码
作者:
universehyf
时间:
2018-9-25 19:31
198个广搜
#include<iostream>
using namespace std;
#define FOR(iii,nn,mm) for(int iii=nn;iii<=mm;iii++)
int dr[4]={-1,0,1,0};
int dc[4]={0,-1,0,1};
int q[2600][2];
int a[51][51];
bool b[51][51];
int t,r,c,n,head,tail;
int main()
{
cin>>n;
FOR(i,0,n-1) FOR(j,0,n-1) cin>>a[i][j];
FOR(i,0,n-1)if((!b[0][i])&&a[0][i]==0)
{r=0;c=i;q[1][0]=r;q[1][1]=c;b[r][c]=1;head=0;tail=1;do{
head++;r=q[head][0];c=q[head][1];FOR(k,0,3)
if(r+dr[k]<=n-1&&c+dc[k]<=n-1&&(!b[r+dr[k]][c+dc[k]])&&a[r+dr[k]][c+dc[k]]==0)
{tail++;b[r+dr[k]][c+dc[k]]=1;q[tail][0]=r+dr[k];q[tail][1]=c+dc[k];}
}while(head<tail);}
FOR(i,0,n-1)if((!b[n-1][i])&&a[n-1][i]==0)
{r=n-1;c=i;q[1][0]=r;q[1][1]=c;b[r][c]=1;head=0;tail=1;do{
head++;r=q[head][0];c=q[head][1];FOR(k,0,3)
if(r+dr[k]<=n-1&&c+dc[k]<=n-1&&(!b[r+dr[k]][c+dc[k]])&&a[r+dr[k]][c+dc[k]]==0)
{tail++;b[r+dr[k]][c+dc[k]]=1;q[tail][0]=r+dr[k];q[tail][1]=c+dc[k];}
}while(head<tail);}
FOR(i,1,n-2) if((!b[i][0])&&a[i][0]==0)
{r=i;c=0;q[1][0]=r;q[1][1]=c;b[r][c]=1;head=0;tail=1;do{
head++;r=q[head][0];c=q[head][1];FOR(k,0,3)
if(r+dr[k]<=n-1&&c+dc[k]<=n-1&&(!b[r+dr[k]][c+dc[k]])&&a[r+dr[k]][c+dc[k]]==0)
{tail++;b[r+dr[k]][c+dc[k]]=1;q[tail][0]=r+dr[k];q[tail][1]=c+dc[k];}
}while(head<tail);}
FOR(i,1,n-2)if((!b[i][n-1])&&a[i][n-1]==0)
{r=i;c=n-1;q[1][0]=r;q[1][1]=c;b[r][c]=1;head=0;tail=1;do{
head++;r=q[head][0];c=q[head][1];FOR(k,0,3)
if(r+dr[k]<=n-1&&c+dc[k]<=n-1&&(!b[r+dr[k]][c+dc[k]])&&a[r+dr[k]][c+dc[k]]==0)
{tail++;b[r+dr[k]][c+dc[k]]=1;q[tail][0]=r+dr[k];q[tail][1]=c+dc[k];}
}while(head<tail);}
///FOR(i,0,n-1) {FOR(j,0,n-1) cout<<a[i][j]<<" ";cout<<endl;}
FOR(i,0,n-1) {FOR(j,0,n-1)
{if(a[i][j]==0)
{
if(b[i][j]) cout<<0;
else cout<<2;
}else cout<<1;
cout<<" ";
}cout<<endl;}
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2