http://acm.hdu.edu.cn/showproblem.php?pid=4121

中国象棋的简单模拟,给出黑方仅存的老帅坐标,再给出红方棋子坐标,问是否把黑方将死。

输入数据有多余空格,所以要用cin,不能用scanf,这块错惨了

#include <iostream>
using namespace std ;
int abs(int x)
{
    return x>0?x:-x ;
}
char map[11][11] ;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}} ;
int RGX,RGY ;
int xx,yy ;
int ok(int x,int y)
{
    if(y!=RGY)
        return 1 ;
    for(int i=x+1 ;i<RGX ;i++)
        if(map[i][y]!='0')
            return 1 ;
    return 0 ;
}
int cha(int x,int y)
{
    if(x!=xx && y!=yy)
        return 0 ;
    if(x==xx)
    {
        int minn=min(y,yy) ;
        int maxn=max(y,yy) ;
        for(int i=minn+1 ;i<maxn ;i++)
            if(map[x][i]!='0')
                return 0 ;
    }
    if(y==yy)
    {
        int minn=min(x,xx) ;
        int maxn=max(x,xx) ;
        for(int i=minn+1 ;i<maxn ;i++)
            if(map[i][y]!='0')
                return 0 ;
    }
    return 1 ;
}
int hor(int x,int y)
{
    if((abs(x-xx)==1 && abs(y-yy)==2) || (abs(x-xx)==2 &&abs(y-yy)==1))
    {
        if(xx-x==-2)
        {
            if(map[x-1][y]!='0')
                return 0 ;
        }
        if(xx-x==2)
        {
            if(map[x+1][y]!='0')
                return 0 ;
        }
        if(yy-y==-2)
        {
            if(map[x][y-1]!='0')
                return 0 ;
        }
        if(yy-y==2)
        {
            if(map[x][y+1]!='0')
                return 0 ;
        }
        return 1 ;
    }
    return 0 ;
}
int can(int x,int y)
{
    if(x!=xx && y!=yy)
        return 0 ;
    int flag=0 ;
    if(x==xx)
    {
        int minn=min(y,yy) ;
        int maxn=max(y,yy) ;
        for(int i=minn+1 ;i<maxn ;i++)
            if(map[x][i]!='0')
                flag++ ;
    }
    if(y==yy)
    {
        int minn=min(x,xx) ;
        int maxn=max(x,xx) ;
        for(int i=minn+1 ;i<maxn ;i++)
            if(map[i][y]!='0')
                flag++ ;
    }
    if(flag==1)
        return 1 ;
    return 0 ;
}
int main()
{
    int n ;
    int x,y ;
    while(~scanf("%d%d%d%*c",&n,&x,&y))
    {
        if(n==0 && x==0 && y==0)
            break ;
        for(int i=0 ;i<11 ;i++)
            for(int j=0 ;j<11 ;j++)
                map[i][j]='0' ;
        for(int i=0 ;i<n ;i++)
        {
            char chr ;
            int a,b ;
            //scanf("%c%d%d%*c",&chr,&a,&b) ;
            cin >> chr >> a >> b ;
            map[a][b]=chr ;
            if(chr=='G')
            {
                RGX=a ;RGY=b ;
            }
        }
        //getchar() ;
        int flag ;
        for(int i=0 ;i<4 ;i++)
        {
            flag=0 ;
            xx=x+dir[i][0] ;
            yy=y+dir[i][1] ;
            if(xx<1 || xx>3){flag=1 ;continue ;}
            if(yy<4 || yy>6){flag=1 ;continue ;}
            if(!ok(xx,yy)){flag=1 ;continue ;}
            char t=map[xx][yy] ;
            map[xx][yy]='0' ;
            for(int j=1 ;j<=10 ;j++)
            {
                for(int k=1 ;k<=9 ;k++)
                {
                    if(map[j][k]=='R')
                    {
                        if(cha(j,k))
                            flag=1 ;    
                    }
                    if(map[j][k]=='H')
                    {
                        if(hor(j,k))
                            flag=1 ;
                    }
                    if(map[j][k]=='C')
                    {
                        if(can(j,k))
                            flag=1 ;
                    }
                }
            }
            if(!flag)
                break ;
            map[xx][yy]=t ;
         }
        if(flag)
            puts("YES") ;
        else
            puts("NO") ;
    }
    return 0 ;
}
View Code