关于这道题,就是暴力搜,搜就玩了。
这道题看着体面和八皇后十分相似,但我认为这道题比八皇后简单一些。不扯淡了
下面开始步入正题,
首先输入,把是B的点记录一下,再把R点记录一下,方便以后搜索。
然后再从四个方向进行搜索,如果当前节点有棋子,那么直接跳过
具体讲解见代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int a[75][3],num,c[75],last[9][9];
int bx[5]={0,-1,-1,1,1},by[5]={0,-1,1,1,-1};//表示斜着走的四个方向
int rx[5]={0,-1,0,1,0},ry[5]={0,0,1,0,-1};//表示横竖着走的四个方向
char b;
void dfs(int x,int y,int jx,int jy)
{
if(last[x+jx][y+jy]==1||x+jx<1||x+jx>8||y+jy<1||y+jy>8)//如果有棋子挡着路,那么就不可以搜索,直接跳出
{
return ;
}
else //否则标记为访问过
{
last[x+jx][y+jy]=2;//2表示为后期访问的,1表示为这个点有棋子。只有当这个点有棋子的时候才会跳过
dfs(x+jx,y+jy,jx,jy);
}
}
int main()
{
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cin>>b;
if(b=='B')
{
a[++num][1]=i;//记录棋子的横坐标
a[num][2]=j;//记录棋子的纵坐标
c[num]=1;//1表示B斜着走
last[i][j]=1;//标记last[i][j]这个点已经有棋子,在以后进行判断是否隔着棋子
}
if(b=='R')
{
a[++num][1]=i;
a[num][2]=j;
c[num]=2;//2表示R横竖着走
last[i][j]=1;//同上
}
}
}
for(int i=1;i<=num;i++)
{
if(c[i]==1)
{
for(int j=1;j<=4;j++)//不管是B还是R都分为4个方向
{
dfs(a[i][1],a[i][2],bx[j],by[j]);//如果是斜着走就用bx,by
}
}
if(c[i]==2)
{
for(int j=1;j<=4;j++)
{
dfs(a[i][1],a[i][2],rx[j],ry[j]);//如果是横竖着走就用rx,ry
}
}
}
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
if(last[i][j]!=0)//如果这个点已经被访问或者有棋子的话,则输出零
cout<<"0";
else//否则输出1
cout<<"1";
}
cout<<endl;
}
return 0;
}