A. Two Semiknights Meet
题目大意:有一个8x8的棋盘,上面放有两个骑士,骑士以“田字”的方式走。每个方格都被定义为good或者bad,问骑士能否在good的格子中相遇?
由于骑士最初位于good的格子中,并且骑士可以按原路返回,所以只需判断骑士是否能够相遇就行了(相遇后可以返回任意一个骑士的初始位置)。根据骑士的移动特性,两个骑士位置的行和列之差应该为4的倍数。
自己开始的时候,还试图计算相遇位置,然后bfs逐个验证,想麻烦了...
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdlib> 5 using namespace std; 6 typedef pair<int, int> pii; 7 8 const int N = 8; 9 int m[N][N]; 10 pii knight[2]; 11 12 bool judge() 13 { 14 int row_diff = abs(knight[0].first - knight[1].first); 15 int col_diff = abs(knight[0].second - knight[1].second); 16 if (row_diff % 4 != 0 || col_diff % 4 != 0) return false; 17 return true; 18 } 19 20 int main() 21 { 22 #ifdef LOCAL 23 freopen("in", "r", stdin); 24 #endif 25 int T; 26 scanf("%d", &T); 27 getchar(); 28 while (T--) 29 { 30 // read data 31 char s[20]; 32 int p = 0; 33 memset(m, 0, sizeof(m)); 34 for (int i = 0; i < 8; ++i) 35 { 36 gets(s); 37 for (int j = 0; j < 8; ++j) 38 { 39 if (s[j] == '#') m[i][j] = 1; 40 else if (s[j] == 'K') 41 { 42 m[i][j] = 1; 43 knight[p++] = make_pair(i,j); 44 } 45 } 46 } 47 if (T) gets(s); 48 49 if (judge()) printf("YES "); 50 else printf("NO "); 51 } 52 return 0; 53 }