Hi I have tested my code with all cases provide in this forum. But I am getting WA.
Please help me to find out what I am doing wrong. Here is my code -
Code: Select all
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
#include <valarray>
#include <functional>
using namespace std;
#define fo(i,j,n) for(i=j;i<n;++i)
#define Fo(i,j,n) for(i=n-1;i>=j;--i)
#define foo(i,j,v) fo(i,j,sz(v))
#define Foo(i,j,v) Fo(i,j,sz(v))
#define li(v) v.begin(),v.end()
#define sz(v) ((int)v.size())
#define CLR(a,v) memset((a),(v),sizeof(a))
#define inf 1000000001
typedef long long Long;
//typedef __int64 Long;
#define pi (2*acos(0))
#define eps 1e-9
#define two(X) (1<<(X))
#define twoL(X) (((Long)(1))<<(X))
#define contain(S,X) (((S)&two(X))!=0)
#define containL(S,X) (((S)&twoL(X))!=0)
#define pb(x) push_back(x)
#define present(m,s) (m.find(s)!=m.end())
typedef pair<int,int> ii;
char BUFFER[100000 + 5];
bool readn(int &n) { return scanf("%d",&n) == 1; }
//bool readl(Long &n) { return scanf("%I64d",&n) == 1; }
bool readd(double &n){ return scanf("%lf",&n) == 1; }
bool reads(string &s){ s = ""; int n = scanf("%s",BUFFER); if(n == 1)s = BUFFER; return n == 1; }
bool readln(string &s){ char *valid = gets(BUFFER); if(valid)s = BUFFER; return ((bool)valid); }
#define maxn 10
char g[maxn][maxn];
bool valid(int i, int j){
if(i < 0 || j < 0 || i >= 8 || j >= 8) return false;
return true;
}
bool rook_queen(int x, int y, int (*f)(int)){
int i;
// check forward
fo(i,1,8-y){
if(g[x][y+i] == f('r') || g[x][y+i] == f('q')) return true;
if(g[x][y+i] != '.') break;
}
// check backward
fo(i,1,y){
if(g[x][y-i] == f('r') || g[x][y-i] == f('q')) return true;
if(g[x][y-i] != '.') break;
}
// check upward
fo(i,1,x){
if(g[x-i][y] == f('r') || g[x-i][y] == f('q')) return true;
if(g[x-i][y] != '.') break;
}
// check downward
fo(i,1,8-x){
if(g[x+i][y] == 'r' || g[x+i][y] == 'q') return true;
if(g[x+i][y] != '.') break;
}
return false;
}
bool bishop_queen(int x, int y, int (*f)(int)){
int i;
// check toward north east corner
fo(i,1,min(x,8-y)){
if(g[x-i][y+i] == f('b') || g[x-i][y+i] == f('q')) return true;
if(g[x-i][y+i] != '.') break;
}
// check toward south east corner
fo(i,1,min(8-x,8-y)){
if(g[x+i][y+i] == f('b') || g[x+i][y+i] == f('q')) return true;
if(g[x+i][y+i] != '.') break;
}
// check toward south west corner
fo(i,1,min(8-x,y)){
if(g[x+i][y-i] == f('b') || g[x+i][y-i] == f('q')) return true;
if(g[x+i][y-i] == '.') break;
}
// check toward north west corner
fo(i,1,min(x,y)){
if(g[x-i][y-i] == f('b') ||g[x-i][y-i] == f('q')) return true;
if(g[x-i][y-i] != '.') break;
}
return false;
}
#define row 0
#define col 1
int dir[][8] = {
1,2,2,1,-1,-2,-2,-1,
2,1,-1,-2,-2,-1,1,2
};
bool knight(int x, int y, int (*f)(int)){
int i;
fo(i, 0,8){
if(valid(x+dir[row][i],y+dir[col][i]) && g[x+dir[row][i]][y+dir[col][i]] == f('n')) return true;
}
return false;
}
bool white_king_checked(int x, int y){
if(valid(x-1,y-1) && g[x-1][y-1] == 'p') return true;
if(valid(x-1,y+1) && g[x-1][y+1] == 'p') return true;
if(knight(x,y,tolower)) return true;
if(rook_queen(x,y,tolower)) return true;
if(bishop_queen(x,y,tolower)) return true;
return false;
}
bool black_king_checked(int x, int y){
if(valid(x+1,y-1) && g[x+1][y-1] == 'P') return true;
if(valid(x+1,y+1) && g[x+1][y+1] == 'P') return true;
if(knight(x,y,toupper)) return true;
if(rook_queen(x,y,toupper)) return true;
if(bishop_queen(x,y,toupper)) return true;
return false;
}
int main()
{
#ifdef localhost
freopen("G:\\test.in","r",stdin);
//freopen("G:\\test.out","w",stdout);
#endif
int i,j, kase = 0;
char dummy[maxn];
ii w,b;
bool flg;
while(1){
flg = false;
fo(i,0,8){
gets(g[i]);
fo(j,0,8){
if(g[i][j] == 'k') { b = ii(i,j); flg = true; }
if(g[i][j] == 'K') { w = ii(i,j); flg = true; }
}
}
if(!flg) break;
gets(dummy); // extra line
printf("Game #%d: ", ++kase);
if(white_king_checked(w.first, w.second)) printf("white king is in check.\n");
else if(black_king_checked(b.first, b.second)) printf("black king is in check.\n");
else printf("no king is in check.\n");
}
return 0;
}
Thanks in advance.