题目:国际象棋,判断当前状态,哪一方被将军了。不会有同时被将军的情况。
分析:模拟。直接按照国际象棋的规则模拟即可。
把操作分成两种,单点判断和射线判断,写成函数减少公共代码,也降低错误率;
然后:兵、马、王(不用判断)都是单点判断,后、车、象都是射线判断。
每种情况,调用不同的方向向量即可。
说明:没有同时成立的情况,注意细节别写错就好了;还有最后那组别输出了。
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; char maps[8][9]; int dxy[16][2] = {1,1,1,-1,-1,1,-1,-1, 1,0,0,1,-1,0,0,-1, 1,2,1,-2,-1,2,-1,-2, 2,1,2,-1,-2,1,-2,-1}; int inmap( int x, int y ) { return (x>=0&&x<8)&&(y>=0&&y<8); } //单点判断 int PKN( int x, int y, char a, int s, int e ) { for ( int i = s ; i < e ; ++ i ) if ( inmap( x+dxy[i][0], y+dxy[i][1] ) ) if ( maps[x+dxy[i][0]][y+dxy[i][1]] == a ) return 1; return 0; } //兵 int Pawn_nahmen( int x, int y, char a ) { if ( maps[x][y] == 'p' ) return PKN( x, y, 'K', 0, 2 ); if ( maps[x][y] == 'P' ) return PKN( x, y, 'k', 2, 4 ); } //马 int Knight_nahmen( int x, int y, char a ) { return PKN( x, y, a, 8, 16 ); } //循环判断 int RBQ( int x, int y, char a, int s, int e ) { for ( int i = s ; i < e ; ++ i ) { int xx = x+dxy[i][0]; int yy = y+dxy[i][1]; while ( inmap( xx, yy ) ) { if ( maps[xx][yy] == a ) return 1; if ( maps[xx][yy] != '.' ) break; xx += dxy[i][0]; yy += dxy[i][1]; } } return 0; } //车 int Rook_nahmen( int x, int y, char a ) { return RBQ( x, y, a, 4, 8 ); } //象 int Bishop_nahmen( int x, int y, char a ) { return RBQ( x, y, a, 0, 4 ); } //后 int Queen_nahmen( int x, int y, char a ) { return RBQ( x, y, a, 0, 8 ); } void Deal() { for ( int i = 0 ; i < 8 ; ++ i ) for ( int j = 0 ; j < 8 ; ++ j ) { int flag = 0; switch ( maps[i][j] ) { case 'p': if ( Pawn_nahmen( i, j, 'K' ) ) flag = 1;break; case 'P': if ( Pawn_nahmen( i, j, 'k' ) ) flag = -1;break; case 'r': if ( Rook_nahmen( i, j, 'K' ) ) flag = 1;break; case 'R': if ( Rook_nahmen( i, j, 'k' ) ) flag = -1;break; case 'b': if ( Bishop_nahmen( i, j, 'K' ) ) flag = 1;break; case 'B': if ( Bishop_nahmen( i, j, 'k' ) ) flag = -1;break; case 'q': if ( Queen_nahmen( i, j, 'K' ) ) flag = 1;break; case 'Q': if ( Queen_nahmen( i, j, 'k' ) ) flag = -1;break; case 'n': if ( Knight_nahmen( i, j, 'K' ) ) flag = 1;break; case 'N': if ( Knight_nahmen( i, j, 'k' ) ) flag = -1;break; default : break; } if ( flag ) { if ( flag == 1 ) printf("white king is in check.\n"); if ( flag == -1 ) printf("black king is in check.\n"); return; } } printf("no king is in check.\n"); return; } int main() { int cases = 1; while ( 1 ) { for ( int i = 0 ; i < 8 ; ++ i ) for ( int j = 0 ; j < 8 ; ++ j ) cin >> maps[i][j]; int count = 0; for ( int i = 0 ; i < 8 ; ++ i ) for ( int j = 0 ; j < 8 ; ++ j ) count += (maps[i][j]=='.'); if ( count == 64 ) break; printf("Game #%d: ",cases ++); Deal(); } return 0; }测试数据:
........ ...k.... ....P... ........ ........ ........ .....K.. ........ ........ ...k.... ..P..... ........ ........ ........ .....K.. ........ ........ ...k.... ........ ........ ........ ...R.... .....K.. ........ ........ ...k..R. ........ ........ ........ ........ .....K.. ........ ........ R..k.... ........ ........ ........ ........ .....K.. ........ ........ ........ ...R.... ...k.... ........ ........ .....K.. ........ ........ ...k.... ........ .....B.. ........ ........ .....K.. ........ ........ ...k.... ........ .B...... ........ ........ .....K.. ........ .....B.. ........ ...k.... ........ ........ ........ .....K.. ........ .B...... ........ ...k.... ........ ........ ........ .....K.. ........ ........ ...k.... ........ ...p.... ........ ...R.... .....K.. ........ ........ ...k.... ..r..... .B...... ........ ........ .....K.. ........ ........ ...k.... ........ ..N..... ........ ........ .....K.. ........ ........ ...k.... ...pp... ....N... ........ ........ .....K.. ........ ........ ........ ........ ...k.... ........ ....p... .....K.. ........ ........ ........ ........ ..pk.... .N...... ........ .....K.. ........ ........ ........ ........ ...k.q.. .....N.. ........ .....K.. ........ ........ ..N..... ........ ...k.... ........ ........ .....K.. ........ ........ ....N... ........ ...k.... ........ ........ .....K.. ........ ........ ........ .....N.. ...k.... ........ ........ .....K.. ........ ........ ........ .N...... ...k.... ........ ........ .....K.. ........ ........ q....... ........ ...k.... ........ ....P... .....K.. ........ ........ q....... ........ ...k.... ........ ....P.p. .....K.. ........ .....r.. ........ ........ ...k.... ........ ........ .r...K.. ........ ........ ........ ........ ...k.... ........ ........ .....K.. ...b.... r......r ........ ........ ...k.... ........ ...n.... .....K.. ........ K......k ........ ........ ........ ........ ........ ........ .......b K......k ........ ..p..... ........ ........ ........ ........ .......b Kp.....k prn..... ..p..... ........ ........ ........ ........ .......b K..R...k ........ ..p..... ........ ........ ........ ........ .......b K.pr...k b....q.. ..p..nn. ........ ..b..... ........ ........ bq.....b K..RB..k .....R.P ..p..... .......Q ........ ........ ........ .......b ......B. ........ ..p..... ........ ..Kpk..r ........ ........ .......b ......P. ...K.k.. ..p..... ........ ........ ........ ........ .......b ........ ...K.... pppppppp ..n.n... ........ ........ .k...... .......b ........ ...K.... pppppppp ........ ........ ........ k....... .......b ........ ........ ...k.... ........ .B.R.... ........ ........ .K...... ..k..... ppp.pppp ........ .R...B.. ........ ........ PPPPPPPP K....... rnbqk.nr ppp..ppp ....p... ...p.... .bPP.... .....N.. PP..PPPP RNBQKB.R ........ ...k.... ....P... ........ ........ ........ .....K.. ........ ........ ...k.... ..P..... ........ ........ ........ .....K.. ........ ........ ...k.... ........ ........ ........ ...R.... .....K.. ........ ........ ...k..R. ........ ........ ........ ........ .....K.. ........ ........ R..k.... ........ ........ ........ ........ .....K.. ........ ........ ........ ...R.... ...k.... ........ ........ .....K.. ........ ........ ...k.... ........ .....B.. ........ ........ .....K.. ........ ........ ...k.... ........ .B...... ........ ........ .....K.. ........ .....B.. ........ ...k.... ........ ........ ........ .....K.. ........ .B...... ........ ...k.... ........ ........ ........ .....K.. ........ ........ ...k.... ........ ...p.... ........ ...R.... .....K.. ........ ........ ...k.... ..r..... .B...... ........ ........ .....K.. ........ ........ ...k.... ........ ..N..... ........ ........ .....K.. ........ ........ ...k.... ...pp... ....N... ........ ........ .....K.. ........ ........ ........ ........ ...k.... ........ ........ .....K.. ........ ........ ........ ........ ..pk.... .N...... ........ .....K.. ........ ........ ........ ........ ...k.q.. .....N.. ........ .....K.. ........ ........ ..N..... ........ ...k.... ........ ........ .....K.. ........ ........ ....N... ........ ...k.... ........ ........ .....K.. ........ ........ ........ .....N.. ...k.... ........ ........ .....K.. ........ ........ ........ .N...... ...k.... ........ ........ .....K.. ........ ........ q....... ........ ...k.... ........ ....P... .....K.. ........ ........ q....... ........ ...k.... ........ ....P.p. .....K.. ........ .....r.. ........ ........ ...k.... ........ ........ .r...K.. ........ ........ ........ ........ ...k.... ........ ........ .....K.. ...b.... r......r ........ ........ ...k.... ........ ...n.... .....K.. ........ ........ ........ ........ ........ ........ ........ ........ ........
UVa 10196 - Check The Check,布布扣,bubuko.com
原文地址:http://blog.csdn.net/mobius_strip/article/details/28750619