题目:国际象棋,判断当前状态,哪一方被将军了。不会有同时被将军的情况。
分析:模拟。直接按照国际象棋的规则模拟即可。
把操作分成两种,单点判断和射线判断,写成函数减少公共代码,也降低错误率;
然后:兵、马、王(不用判断)都是单点判断,后、车、象都是射线判断。
每种情况,调用不同的方向向量即可。
说明:没有同时成立的情况,注意细节别写错就好了;还有最后那组别输出了。
#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