UVA - 10196 - Check The Check

来源:互联网 发布:淘宝条形码 编辑:程序博客网 时间:2024/05/10 16:48

题目大意:对不同的棋子不同的走法
                 卒(p 或 P):只能吃斜前方一格的棋子;
                 马(n 或 N) :和中国象棋一样,走“日”字形,只有马可以越过其他棋子(不过没蹩马腿的规则);
                 象(b 或 B) :可以沿对角线向前向后走任意格,
                 车(r 或 R)  :和中国象棋一样,走直线
                 后(q或 Q)  :走法相当于 “车” 和 “象” 的组合,就是既可以直着走,又可以沿对角线
                 王(k或 K)   :向任意八个方向走一格
                 判断是否有一方被”将军“了;大写字母代表黑方,小写字母代表白方,白方在棋盘下部,黑方在上部;
解题方法: 直接模拟,对每个位置的棋子判断一下,思路很清楚,其实很简单的;(代码写的稍微有点乱,616行,不过可以减少到500多行)

AC code:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
char board[10][10];
int main()
{
bool flag;
int cnt=0;
//freopen(\"in.txt\",\"r\",stdin);
while(1)
{
cnt++;
flag=false;
for(int i=0; i<8; i++)
{
gets(board[i]);
for(int j=0; !flag,j<8; j++)
if(board[i][j]!=\'.\')
{
flag=true;
break;
}
}
if(!flag) break;
getchar();
int mark=0;
for(int i=0; i<8; i++)
{
for(int j=0; j<8; j++)
{
switch (board[i][j])
{
case \'p\':
{
if(i+1<8)
{
if(j==0)
{
if(board[i+1][1]==\'K\')
{
mark=1;
break;
}
}
else if(j==7)
{
if(board[i+1][6]==\'K\')
 {
mark=1;
break;
}
}
else
{
if(board[i+1][j-1]==\'K\'||board[i+1][j+1]==\'K\')
 {
mark=1;
break;
}
}
}
break;
}
case \'P\':
{
if(i-1>=0)
{
if(j==0)
{
if(board[i-1][1]==\'k\')
{
mark=2;
break;
}
}
if(j==7)
{
if(board[i-1][6]==\'k\')
 {
mark=2;
break;
}
}
else
{
if(board[i-1][j-1]==\'k\'||board[i-1][j+1]==\'k\')
 {
mark=2;
break;
}
}
}
break;
}
case \'n\':
{
if(i+2<8)
{
if(j+1<8&&board[i+2][j+1]==\'K\')
{
mark=1;break;
break;
}
if(j-1>=0&&board[i+2][j-1]==\'K\')
{
mark=1;
break;
}
}
if(i-2>=0)
{
if(j+1<8 && board[i-2][j+1]==\'K\')
{
mark=1;
break;
}
if(j-1>=0 && board[i-2][j-1]==\'K\')
   {
mark=1;
break;
}
}
if(i+1<8)
{
if(j+2<8 && board[i+1][j+2]==\'K\')
  {
mark=1;
break;
}
if(j-2>=0 && board[i+1][j-2]==\'K\')
   {
mark=1;
break;
}
}
if(i-1>=0)
{
if(j+2<8 && board[i-1][j+2]==\'K\')
{
mark=1;
break;
}
if(j-2>=0 && board[i-1][j-2]==\'K\')
   {
mark=1;
break;
}
}
break;
}
case \'N\':
{
if(i+2<8)
{
if(j+1<8&&board[i+2][j+1]==\'k\')
 {
mark=2;
break;
}
if(j-1>=0&&board[i+2][j-1]==\'k\')
{
mark=2;
break;
}
}
if(i-2>=0)
{
if(j+1<8 && board[i-2][j+1]==\'k\')
 {
mark=2;
break;
}
if(j-1>=0 && board[i-2][j-1]==\'k\')
{
mark=2;
break;
}
}
if(i+1<8)
{
if(j+2<8 && board[i+1][j+2]==\'k\')
 {
mark=2;
break;
}
if(j-2>=0 && board[i+1][j-2]==\'k\')
 {
mark=2;
break;
}
}
if(i-1>=0)
{
if(j+2<8 && board[i-1][j+2]==\'k\')
{
mark=2;
break;
}
if(j-2>=0 && board[i-1][j-2]==\'k\')
 {
mark=2;
break;
}
}
break;
}
case \'b\':
{
for(int s=i+1,t=j+1; s<8&&t<8; t++,s++)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
if(board[s][t]!=\'.\') break;
}
for(int s=i+1,t=j-1; s<8&&t>=0; t--,s++)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j-1; s>=0&&t>=0; t--,s--)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j+1; s>=0&&t<8; t++,s--)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
if(board[s][t]!=\'.\') break;
}
break;
}
case \'B\':
{
for(int s=i+1,t=j+1; s<8&&t<8; t++,s++)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
if(board[s][t]!=\'.\') break;
}
for(int s=i+1,t=j-1; s<8&&t>=0; t--,s++)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
 if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j-1; s>=0&&t>=0; t--,s--)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j+1; s>=0&&t<8; t++,s--)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
if(board[s][t]!=\'.\') break;
}
break;
}
case \'r\':
{
for(int t=i+1; t<8; t++)
if(board[t][j]==\'K\')
{
mark=1;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=i-1; t>=0; t--)
if(board[t][j]==\'K\')
{
mark=1;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=j+1; t<8; t++)
if(board[i][t]==\'K\')
{
mark=1;
break;
}
else if(board[i][t]!=\'.\')break;
for(int t=j-1; t>=0; t--)
if(board[i][t]==\'K\')
{
mark=1;
break;
}
else if(board[i][t]!=\'.\')break;
break;
}
case \'R\':
{
for(int t=i+1; t<8; t++)
if(board[t][j]==\'k\')
{
mark=2;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=i-1; t>=0; t--)
if(board[t][j]==\'k\')
{
mark=2;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=j+1; t<8; t++)
if(board[i][t]==\'k\')
{
mark=2;
break;
}
else if(board[i][t]!=\'.\')break;
for(int t=j-1; t>=0; t--)
if(board[i][t]==\'k\')
{
mark=2;
break;
}
else if(board[i][t]!=\'.\')break;
break;
}
case \'q\':
{
for(int s=i+1,t=j+1; s<8&&t<8; t++,s++)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int s=i+1,t=j-1; s<8&&t>=0; t--,s++)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j-1; s>=0&&t>=0; t--,s--)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j+1; s>=0&&t<8; t++,s--)
{
if(board[s][t]==\'K\')
{
mark=1;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int t=i+1; t<8; t++)
if(board[t][j]==\'K\')
{
mark=1;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=i-1; t>=0; t--)
if(board[t][j]==\'K\')
{
mark=1;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=j+1; t<8; t++)
if(board[i][t]==\'K\')
{
mark=1;
break;
}
else if(board[i][t]!=\'.\')break;
for(int t=j-1; t>=0; t--)
if(board[i][t]==\'K\')
{
mark=1;
break;
}
else if(board[i][t]!=\'.\')break;
break;
}
case \'Q\':
{
for(int s=i+1,t=j+1; s<8&&t<8; t++,s++)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int s=i+1,t=j-1; s<8&&t>=0; t--,s++)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j-1; s>=0&&t>=0; t--,s--)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int s=i-1,t=j+1; s>=0&&t<8; t++,s--)
{
if(board[s][t]==\'k\')
{
mark=2;
break;
}
else if(board[s][t]!=\'.\') break;
}
for(int t=i+1; t<8; t++)
if(board[t][j]==\'k\')
{
mark=2;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=i-1; t>=0; t--)
if(board[t][j]==\'k\')
{
mark=2;
break;
}
else if(board[t][j]!=\'.\')break;
for(int t=j+1; t<8; t++)
if(board[i][t]==\'k\')
{
mark=2;
break;
}
else if(board[i][t]!=\'.\')break;
for(int t=j-1; t>=0; t--)
if(board[i][t]==\'k\')
{
mark=2;
break;
}
else if(board[i][t]!=\'.\')break;
break;
}
case \'k\':
{
if(i+1<8)
{
if(j+1<8&&board[i+1][j+1]==\'K\')
{
mark=1;
break;
}
if(j-1>=0&&board[i+1][j-1]==\'K\')
{
mark=1;
break;
}
if(board[i+1][j]==\'K\')
{
mark=1;
break;
}
}
if(i-1>=0)
{
if(j+1<8&&board[i-1][j+1]==\'K\')
{
mark=1;
break;
}
if(j-1>=0&&board[i-1][j-1]==\'K\')
{
mark=1;
break;
}
if(board[i-1][j]==\'K\')
{
mark=1;
break;
}
}
if(j-1>=0)
{
if(board[i][j-1]==\'K\')
{
mark=1;
break;
}
}
if(j+1<8)
{
if(board[i][j+1]==\'K\')
{
mark=1;
break;
}
}
break;
}
case \'K\':
{
if(i+1<8)
{
if(j+1<8&&board[i+1][j+1]==\'k\')
{
mark=2;
break;
}
if(j-1>=0&&board[i+1][j-1]==\'k\')
{
mark=2;
break;
}
if(board[i+1][j]==\'k\')
{
mark=2;
break;
}
}
if(i-1>=0)
{
if(j+1<8&&board[i-1][j+1]==\'k\')
{
mark=2;
break;
}
if(j-1>=0&&board[i-1][j-1]==\'k\')
{
mark=2;
break;
}
if(board[i-1][j]==\'k\')
{
mark=2;
break;
}
}
if(j-1>=0)
{
if(board[i][j-1]==\'k\')
{
mark=2;
break;
}
}
if(j+1<8)
{
if(board[i][j+1]==\'k\')
{
mark=2;
break;
}
}
break;
}
}
}
if(mark) break;
}
if(mark==0)
cout<<\"Game #\"<<cnt<<\": no king is in check.\"<<endl;
else if(mark==1)
 cout<<\"Game #\"<<cnt<<\": white king is in check.\"<<endl;
else if(mark==2)
 cout<<\"Game #\"<<cnt<<\": black king is in check.\"<<endl;

}
return 0;
}
原创粉丝点击