问题标题: 1403 数字方阵 0分,Wrong Answer:0分 大佬帮帮忙。

1
0
已解决
栾峻岩
栾峻岩
初级天翼
初级天翼
#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

深度搜索 || 广度搜索

 


2
已采纳
梁锦程
梁锦程
高级光能
高级光能

这个我给你提示一下

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()函数你自己要尝试去写好吗??加油!

1
曾凡一
曾凡一
新手光能
新手光能

这道题应该用迷宫问题的思路去写,而且一共有八个方向。

0
0
0
0
颜咏春
颜咏春
中级光能
中级光能

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;

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;
                        }
                    }
                }
            }
        }
    }

 

我要回答