求且力题目
题目描述:
给你一个黑白棋盘,棋盘上有些位置已经放了黑子或者白子,现在问你,有没有一种放置方案可以用黑子或者白子放满整个棋盘,使得没有两个相邻的格点放了同色的棋子。
输入格式:
多组测试数据
每组数据
第一行输入两个整数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吧