一直卡在测试用例七,可能是因为没有判断时间,两个骑士要在同一时刻到达某一点
用bfs 搜出每个骑士的各个可能地点,标记时间
如果某处不是'#',且两个骑士相差的时间%2 == 0 ,就说明存在
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;
char str[10][10];
int vis[10][10];
int mark[10][10];
int mark2[10][10];
int dir[4][2] = { -2,2, -2,-2, 2,-2, 2,2};
struct node{
int x,y,step;
}cur;
int bfs(int x,int y,int tab)
{
queue<node> q;
cur.x = x;
cur.y = y;
cur.step = 1;
vis[x][y] = 1;
if( tab == 1) mark[x][y] = 1;
else mark[x][y] = 1;
q.push(cur);
int step;
while( !q.empty())
{
cur = q.front();
q.pop();
x = cur.x;
y = cur.y;
step = cur.step;
for(int i = 0; i < 4; i++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if( xx >= 0 && xx < 8 && yy >= 0 && yy < 8 && vis[xx][yy] == 0)
{
vis[xx][yy] = 1;
if(tab == 1) mark[xx][yy] = step + 1;
else mark2[xx][yy] = step + 1;
cur.x = xx;
cur.y = yy;
cur.step = step + 1;
q.push(cur);
}
}
}
return 0;
}
int main()
{
int t;
int x1,x2,y1,y2;
scanf("%d",&t);
while(t--)
{
int flag = 0;
for(int i=0;i<8;i++)
{
scanf("%s",str + i);
for(int j=0;j<8;j++)
{
if( str[i][j] == 'K')
{
if( flag == 0)
{
x1 = i;
y1 = j;
flag = 1;
}
else
{
x2 = i;
y2 = j;
}
}
}
}
if(t!=0)
getchar();
memset(mark,0,sizeof(mark));
memset(vis,0,sizeof(vis));
bfs(x1,y1,1);
memset(vis,0,sizeof(vis));
memset(mark2,0,sizeof(mark2));
bfs(x2,y2,2);
int ans = 0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(str[i][j] != '#' && mark[i][j] != 0 && mark2[i][j] != 0 && (abs(mark[i][j] - mark2[i][j] ) % 2 == 0) )
ans = 1;
if( ans == 1 )
printf("YES\n");
else printf("NO\n");
}
return 0;
}