初级天翼
#include <iostream>
using namespace std;
int a[20][20];
bool used[20][20];
const int dir[4][2]={
{-1,0},{0,-1},{0,1},{1,0}
};
void dfs(int x,int y)
{
int count=0;
int nx,ny;
for (int i=0;i<4;i++)
{
nx=x+dir[i][0];
ny=y+dir[i][1];
if (a[nx][ny]!=1 && a[nx][ny]!=2)
used[nx][ny]=true;
if(a[nx][ny]==1)
{
count++;
}
}
if (count>=2 && used[x][y]!=false)
{
a[x][y]=2;
used[x][y]=true;
}
}
int main()
{
int n;
bool flag=false;
bool flag2=false;
cin>>n;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for (int j=1;j<=n;j++)
{
if (a[1][j]==1)
flag=true;
if (a[j][1]==1)
flag2=true;
}
if (flag==false)
{
for (int i=1;i<=n;i++)
used[2][i]=false;
}
if (flag2==false)
{
for (int i=1;i<=n;i++)
used[i][2]=false;
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
dfs(i,j);
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (used[i][j]==false)
cout<<a[i][j]<<" ";
else if (used[i][j]=true)
cout<<"2 ";
}
cout<<endl;
}
return 0;
}
大佬帮帮忙吧。
网址:http://judge.codingtang.com/problem/1403/
题目:
1403 数字方阵
题目描述 Description
由数字组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。 现要求把闭合圈内的所有数字都填写成2.
输入描述 Input Description
每组测试数据第一行一个整数:n。其中n(1<=n<=8)
接下来n行,由0和1组成的n*n的方阵。
方阵内只有一个闭合圈,圈内至少有一个0。
输出描述 Output Description
变化后的闭合圈。
样例输入 Sample Input
例如:6X6的方阵(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
样例输出 Sample Output
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
数据范围及提示 Data Size & Hint
深度搜索 || 广度搜索
高级光能
这个我给你提示一下
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>b[i][j];
if(b[i][j]==1)a[i][j]=0;
else a[i][j]=1;
}
}
search(1,1);
search(1,n);
search(n,1);
search(n,n);
for(int i=1;i<=n;i++)
{
if(a[i][1]==1)search(i,1);
if(a[i][n]==1)search(i,n);
if(a[1][i]==1)search(1,i);
if(a[n][i]==1)search(n,i);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==1)b[i][j]=2;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-1;j++)cout<<b[i][j]<<' ';
cout<<b[i][n]<<endl;
}
return 0;
但search()函数你自己要尝试去写好吗??加油!
中级光能
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>b[i][j];
if(b[i][j]==1)a[i][j]=0;
else a[i][j]=1;
}
}
search(1,1);
search(1,n);
search(n,1);
search(n,n);
for(int i=1;i<=n;i++)
{
if(a[i][1]==1)search(i,1);
if(a[i][n]==1)search(i,n);
if(a[1][i]==1)search(1,i);
if(a[n][i]==1)search(n,i);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==1)b[i][j]=2;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-1;j++)cout<<b[i][j]<<' ';
cout<<b[i][n]<<endl;
}
return 0;
资深守护
可以直接用循环做啊,简单的判断查找
核心代码如下:
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(a[i][j]=='c')
{
for(int k=0;k<8;++k)
{
int ni=i,nj=j,num=1;
for(int m=1;m<=9;++m)
{
ni+=dir[k][0];nj+=dir[k][1];
if(ni>=1&&ni<=n&&nj>=1&&nj<=n&&str[m]==a[ni][nj])
{
++num;
}
else break;
}
if(num==10)
{
int ni=i,nj=j;
keep[ni][nj]=true;
for(int m=1;m<=9;++m)
{
ni+=dir[k][0];nj+=dir[k][1];
keep[ni][nj]=true;
}
}
}
}
}
}