UVa 10196 - Check The Check

本文详细介绍了如何使用C++实现国际象棋中将军判断的算法,通过模拟每种棋子的移动规则来确定是否将军。代码包含了兵、马、王、后、车、象等棋子的移动逻辑,并通过函数复用减少了重复代码。实现中考虑了单点判断和射线判断两种方式,确保了逻辑的清晰和高效。

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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值