codeforces 362A C

来源:互联网 发布:360浏览器网络连接错误 编辑:程序博客网 时间:2024/06/06 00:25
一直卡在测试用例七,可能是因为没有判断时间,两个骑士要在同一时刻到达某一点
用bfs 搜出每个骑士的各个可能地点,标记时间
如果某处不是'#',且两个骑士相差的时间%2 == 0 ,就说明存在

C - Two Semiknights Meet

 CodeForces - 362A 
#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;}

0 0