Uva1589 - Xiangqi

来源:互联网 发布:java web api接口开发 编辑:程序博客网 时间:2024/06/17 20:12

思路:把‘黑将’不能走的地方用'*'填掉,标记在map[][]上,map1[][]上存储棋子的位置。下棋中一般不会出现的情况如

3 1 5

R 4 4

R 4 6

G 10 5

这时黑棋未被将死.这种情况应该打印‘NO’,但原题的测试样例没有管这种不合下棋常理的情况,所以能AC.

开始输入用getchar(),老是有问题,改成cin>>...后就AC了。。。

//#define LOCAL#include<stdio.h>#include<string.h>#include<time.h>#include<iostream>using namespace std;int N, bgx, bgy, gx, gy;char map[15][15];char map1[15][15];struct C{char ch;int x, y;}C1,C2;struct H{char ch;int x, y;}H1,H2;struct R{char ch;int x, y;}R1,R2;//输出中间结果调试用void myprintf(char map[][15]){for (int i = 1; i <= 10; i++){for (int j =1; j <= 9; j++){printf("%c ", map[i][j]);}printf("\n");}printf("\n");}//马:先判断马是否为'hobbled horse',再判断填'*'处是否越界void Horse(H H3){if (H3.ch!='0'){if (map1[H3.x + 1][H3.y] != '1'){if (H3.y - 1>0) map[H3.x + 2][H3.y - 1] = '*'; map[H3.x + 2][H3.y + 1] = '*';}if (map1[H3.x - 1][H3.y] != '1'){if (H3.x - 2>0 && H3.y - 1>0) map[H3.x - 2][H3.y - 1] = '*';if (H3.x - 2>0) map[H3.x - 2][H3.y + 1] = '*';}if (map1[H3.x][H3.y - 1] != '1'){if (H3.y - 2>0) map[H3.x + 1][H3.y - 2] = '*';if (H3.x - 1>0 && H3.y - 2>0)map[H3.x - 1][H3.y - 2] = '*';}if (map1[H3.x][H3.y + 1] != '1') {map[H3.x + 1][H3.y + 2] = '*';if (H3.x - 1>0) map[H3.x - 1][H3.y + 2] = '*';}}}void CR(R R3){if (R3.ch!='0'){for (int i = R3.x - 1; i >0; i--){ map[i][R3.y] = '*'; if (map1[i][R3.y] == '1') break;}for (int i = R3.x + 1;  i <4; i++){map[i][R3.y] = '*';if (map1[i][R3.y] == '1') break;}for (int i = R3.y - 1;  i >3; i--){map[R3.x][i] = '*';if (map1[R3.x][i] == '1') break;}for (int i = R3.y + 1;  i<7; i++){map[R3.x][i] = '*';if (map1[R3.x][i] == '1') break;}}}void Cannon(C C3){if (C3.ch != '0'){if (C3.x>bgx){for (int i = C3.x-1;i>0; i--){int d4=0;if (map1[i][C3.y] == '1'){i--;for (i; i > 0; i--){map[i][C3.y] = '*';if (map1[i][C3.y] == '1'){d4 = 1; break;}}}if (d4) break;}}else if (C3.x < bgx){if (map1[C3.x + 1][C3.y] == '1'&&map1[C3.x + 2][C3.y] != '1')map[C3.x + 2][C3.y] = '*';}if (C3.y < bgy){for (int i = C3.y+1; i<10; i++){int d4 = 0;if (map1[C3.x][i] == '1'){i++;for (i ; i <10; i++){map[C3.x][i] = '*';if (map1[C3.x][i] == '1'){d4 = 1; break;}}}if (d4) break;}}else if (C3.y > bgy){for (int i = C3.y-1; i>0; i--){int d4 = 0;if (map1[C3.x][i] == '1'){i--;for (i ; i > 0; i--){map[C3.x][i] = '*';if (map1[C3.x][i] == '1'){d4 = 1; break;}}}if (d4) break;}}}}int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endifwhile (scanf("%d%d%d", &N, &bgx, &bgy) == 3 && N ||bgx||bgy){memset(map, '0', sizeof(map));memset(map1, '0', sizeof(map1));bool d2=1;int first1,first2,first3;first1 = first2 = first3 = 1;C1.ch = C2.ch = H1.ch = H2.ch = R1.ch = R2.ch = '0';while (N--){char ch;cin >> ch;int x, y;if (ch == 'G'){scanf("%d%d", &gx, &gy);map1[gx][gy] = '1';}else if (ch == 'R'){scanf("%d%d", &x, &y);map1[x][y] = '1'; if (first1) { first1 = 0; R1.ch = 'R', R1.x = x, R1.y = y; }else{ R2.ch = 'R', R2.x = x,R2.y = y; }}else if (ch == 'H'){scanf("%d%d", &x, &y);map1[x][y] = '1';if (first2) { first2 = 0; H1.ch = 'H', H1.x = x,H1.y = y; }else{ H2.ch = 'H',H2.x = x,H2.y = y; }}else if (ch == 'C'){scanf("%d%d", &x, &y);map1[x][y] = '1';if (first3) { first3 = 0; C1.ch = 'C', C1.x = x, C1.y = y; }else{ C2.ch = 'C', C2.x = x, C2.y = y; }}}//myprintf(map1);int d1 = 0;for (int i = gx-1; i >0; i--){if (map1[i][gy] == '1'){d1 = i; break;}}if (d1 == bgx) d1 = 0;if (!d1){for (int i = 1; i < 4; i++){map[i][gy] = '*';//将与帅相对的情况}}else {for (int i = d1; i < 4; i++){map[i][gy] = '*';}}Horse(H1);Horse(H2);CR(R1);CR(R2);Cannon(C1); Cannon(C2);//myprintf(map);//把将的palace用'*'围起来,方便下面判断for (int i = 3; i <= 7; i++){map[0][i] = '*';map[4][i] = '*';}for (int i = 1; i <= 3; i++){map[i][3] = '*';map[i][7] = '*';}if (map[bgx][bgy-1] == '*'&&map[bgx][bgy+1] == '*'&&map[bgx-1][bgy] == '*'&&map[bgx+1][bgy] == '*')d2 = 0;//myprintf(map);if (!d2) printf("YES\n");else printf("NO\n");}//printf("Time used=%.3f\n", (double)clock() / CLOCKS_PER_SEC);return 0;}



0 0