[ACM ] 10196 - Check The Check
這題是我們的作業
可是我目前,ACM測資過了
別人給的亂七八糟測資也都過了(單項測+無王情形)
是不是我漏掉什麼呢?
測資也沒要求說要output空一行啊
output也是從ACM複製貼上的
想不到還有什麼可能性了...
ps.程式碼有點長有點雜亂,請小心服用
#include <stdio.h>
#include <stdlib.h>
struct coordinates
{
int x,y;
}cur;
char chessboard[8][8];
int isWKInCheck(struct coordinates wKing);
int isBKInCheck(struct coordinates bKing);
int main()
{
int cou=1,i,j,wKingCheck,bKingCheck;
while (1)
{
struct coordinates wKing,bKing;//declare
wKing.x=wKing.y=bKing.x=bKing.y=-9;//initialize to -9
for (i=0;i<8;i++) scanf("%s",chessboard[i]);
int end=1;
for (j=0;j<8;j++) for (i=0;i<8;i++) if (chessboard[j][i]!='.')
{
end=0;
break;
}
if (end) break;
for (j=0;j<8;j++) for (i=0;i<8;i++)
{
if (chessboard[j][i]=='K')
{
wKing.x=i;
wKing.y=j;
}
else if (chessboard[j][i]=='k')
{
bKing.x=i;
bKing.y=j;
}
}
wKingCheck=isWKInCheck(wKing);
bKingCheck=isBKInCheck(bKing);
if (wKingCheck) printf("Game #%d: white king is in check.\n",cou);
else if (bKingCheck) printf("Game #%d: black king is in
check.\n",cou);
else printf("Game #%d: no king is in check.\n",cou);
cou++;
}
return 0;
}
int isWKInCheck(struct coordinates wKing)
{
cur=wKing;//the first assignment
while (1)//left of the above
{
--cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='b'||curChar=='p'||curChar=='q') return 1;
else if (curChar=='n'||curChar=='r'||curChar=='k') break;//the
enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//the above
{
--cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k')
break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//right of the above
{
--cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='p'||curChar=='b'||curChar=='q') return 1;
else if (curChar=='n'||curChar=='r'||curChar=='k') break;//the
enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//left
{
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k')
break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//right
{
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k')
break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//left of the below
{
++cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='b'||curChar=='q') return 1;
else if (curChar=='n'||curChar=='p'||curChar=='r'||curChar=='k')
break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//the below
{
++cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k')
break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//right of the below
{
++cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='b'||curChar=='q') return 1;
else if (curChar=='n'||curChar=='p'||curChar=='r'||curChar=='k')
break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
struct coordinates N[8];//assume that the knight are on one of the 8
situation
N[0].x=wKing.x-2;//initialize
N[0].y=wKing.y-1;
N[1].x=wKing.x-1;
N[1].y=wKing.y-2;
N[2].x=wKing.x+2;
N[2].y=wKing.y-1;
N[3].x=wKing.x+1;
N[3].y=wKing.y-2;
N[4].x=wKing.x-2;
N[4].y=wKing.y+1;
N[5].x=wKing.x-1;
N[5].y=wKing.y+2;
N[6].x=wKing.x+2;
N[6].y=wKing.y+1;
N[7].x=wKing.x+1;
N[7].y=wKing.y+2;
int i;
for (i=0;i<8;i++) if (chessboard[N[i].y][N[i].x]=='n') return 1;
return 0;
}
int isBKInCheck(struct coordinates bKing)
{
cur=bKing;//the first assignment
while (1)//left of the above
{
--cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='B'||curChar=='Q') return 1;
else if (curChar=='N'||curChar=='P'||curChar=='R'||curChar=='K')
break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//the above
{
--cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K')
break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//right of the above
{
--cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='B'||curChar=='Q') return 1;
else if (curChar=='N'||curChar=='P'||curChar=='R'||curChar=='K')
break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//left
{
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K')
break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//right
{
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K')
break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//left of the below
{
++cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='B'||curChar=='P'||curChar=='Q') return 1;
else if (curChar=='N'||curChar=='R'||curChar=='K') break;//the
enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//the below
{
++cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K')
break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//right of the below
{
++cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make
statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='P'||curChar=='B'||curChar=='Q') return 1;
else if (curChar=='N'||curChar=='R'||curChar=='K') break;//the
enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
struct coordinates N[8];//assume that the knight are on one of the 8
situation
N[0].x=bKing.x-2;//initialize
N[0].y=bKing.y-1;
N[1].x=bKing.x-1;
N[1].y=bKing.y-2;
N[2].x=bKing.x+2;
N[2].y=bKing.y-1;
N[3].x=bKing.x+1;
N[3].y=bKing.y-2;
N[4].x=bKing.x-2;
N[4].y=bKing.y+1;
N[5].x=bKing.x-1;
N[5].y=bKing.y+2;
N[6].x=bKing.x+2;
N[6].y=bKing.y+1;
N[7].x=bKing.x+1;
N[7].y=bKing.y+2;
int i;
for (i=0;i<8;i++) if (chessboard[N[i].y][N[i].x]=='N') return 1;
return 0;
}
Problem Verdict Language Run Time Submission Date
Check The Check Wrong answer C++ 0.010 2009-04-22 12:46:22
感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.227.191.147
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章