求且力一辶首题(恶心的标题错误)

求且力题目

题目描述:

给你一个黑白棋盘,棋盘上有些位置已经放了黑子或者白子,现在问你,有没有一种放置方案可以用黑子或者白子放满整个棋盘,使得没有两个相邻的格点放了同色的棋子。
输入格式:
多组测试数据
每组数据
第一行输入两个整数n,m
接下来n行每行输入一个长度为m的字符串.
一共有’W’, ‘B’, ‘?’三种字符,W表示白子,B表示黑子。’?’表示还没有放子
输出格式:
如果存在一种方案,输出”Possible”
如果不存在输出”Impossible”

样例输入:
3 3
W?W
??B
???
3 2
W?
??
B?
样例输出:
Possible
Impossible
约定:
1<=n,m<=100

这是我的我也不知道为啥错


```c++
#include 
using namespace std;
char a[110][110];
int n,m;
bool c;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
void dfs(int x,int y,char in)
{
    if(x<1 || x>n || y<1 || y>n)
    {
        return;
    }
    a[x][y]=in;
    for(int k=0;k<4;k++)
    {
        if(a[x+dx[k]][y+dy[k]]==in)
        {
            c=false;
            return;
        }
        else if(a[x+dx[k]][y+dy[k]]=='?')
        {
            if(in=='W')
                dfs(x+dx[k],y+dy[k],'B');
            else
                dfs(x+dx[k],y+dy[k],'W');
        }
    }
}
int main()
{
    while(cin>>n>>m)
    {
        c=true;
        for(int i=0;i<110;i++)
        {
            for(int j=0;j<110;j++)
            {
                a[i][j]=0;
            }
        }
        bool can=true;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        bool f=false;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(a[i][j]!='?')
                {
                    f=true;
                    if(a[i][j]=='W')
                    {
                        for(int k=0;k<4;k++)
                        {
                            dfs(i+dx[k],j+dy[k],'B');
                        }
                    }
                    else if(a[i][j]=='B')
                    {
                        for(int k=0;k<4;k++)
                        {
                            dfs(i+dx[k],j+dy[k],'W');
                        }
                    }
                }
                if(!c)
                {
                    cout<<"Impossible"<else
                {
                    cout<<"Possible"<if(f)
                break;
        }
    }
    return 0;
}

```

你这第一次进dfs都有问题,你判断的是i,j == w 结果进去根本不管他旁边是啥直接给人赋值为B,要是他旁边是w,按理说是直接不行的

第一个点

博主在代码的第 $76~85$ 行这里,只要在这行碰到的元素全为 $?$ 就会输出 Possible 并且跳出本行的染色

举例:

3 3
???
WWW
WWW

博主的代码会输出:

Possible
Impossible

第二个点

其实博主没必要写的这么复杂,你可以想一下染色的情况

  • ① 全图都为 ? 那么说明肯定能满足条件,直接输出 Possible
  • ② 我们只需要记录任意一个 W 或者任意一个 B 的点的坐标,然后任意从一个坐标点,开始往四个方向染色(当然可能存在只有 W 或者只有 B 的情况,所以分开一边统计一个即可)
    因为以及存在的点的颜色以及确定了,这样其实整个图的颜色也就确定了,在染色的情况下遇到冲突就说明 Impossible,完成染色后我们判断一下 flag 是否冲突即可~

望采纳~

if(x<1 || x>n || y<1 || y>n)
应该是y>m吧