题解 P1162 【填涂颜色】

· · 题解

新思路!!!

为何不枚举每一个“0”位置,再判断是否合法呢??

方法: 1.枚举所有的“0”位置

2.看看当前位置上面有没有“1”

3.看看当前位置下面有没有“1”

4.看看当前位置左面有没有“1”

5.看看当前位置右面有没有“1”

6.若都有“1”,就赋值为“2”

7.输出不解释

附1:虽然在BFS试炼场里面,可是模拟可以过

附2:代码

#include<iostream>
using namespace std;
int n;
const int mx=35;
int a[mx][mx],i,j,k;
bool b[5];///判断四个方向有没有数字1 
int main()
{
    cin>>n;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++) cin>>a[i][j];
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
        {
            if (a[i][j]==1) continue;
            for (k=1;k<=4;k++) b[k]=false;///先假设都没有
            for (k=1;k<=i && !b[1];k++) 
                if (a[k][j]==1) b[1]=true;///下面是判断四个方向有没有“1”
            for (k=i;k<=n && !b[2];k++)
                if (a[k][j]==1) b[2]=true;
            for (k=1;k<=j && !b[3];k++)
                if (a[i][k]==1) b[3]=true;
            for (k=j;k<=n && !b[4];k++)
                if (a[i][k]==1) b[4]=true;
            if (b[1]&&b[2]&&b[3]&&b[4]) a[i][j]=2;///若都有,就赋值为“2”
        }
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=n;j++) 
            cout<<a[i][j]<<" ";
        cout<<endl;///输出不解释
    }
    return 0;
}