首页 > 代码库 > UVa 10196 - Check The Check

UVa 10196 - Check The Check

题目:国际象棋,判断当前状态,哪一方被将军了。不会有同时被将军的情况。

分析:模拟。直接按照国际象棋的规则模拟即可。

            把操作分成两种,单点判断和射线判断,写成函数减少公共代码,也降低错误率;

            然后:兵、马、王(不用判断)都是单点判断,后、车、象都是射线判断。

            每种情况,调用不同的方向向量即可。

说明:没有同时成立的情况,注意细节别写错就好了;还有最后那组别输出了。

#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..
........

........
........
........
........
........
........
........
........