UVa 10196 - Check The Check
版权声明:本文为博主原创文章,未经博主同意不得转载。
https://blog.csdn.net/mobius_strip/article/details/28750619
题目:国际象棋,推断当前状态,哪一方被将军了。
不会有同一时候被将军的情况。
分析:模拟。直接依照国际象棋的规则模拟就可以。
把操作分成两种。单点推断和射线推断,写成函数降低公共代码,也降低错误率;
然后:兵、马、王(不用推断)都是单点推断。后、车、象都是射线推断。
每种情况。调用不同的方向向量就可以。
说明:没有同一时候成立的情况。注意细节别写错就好了;还有最后那组别输出了。
#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..
........
........
........
........
........
........
........
........
........