Uva 1589 Xiangqi

//

原来blog上的代码,第一次做的时候很麻烦,枚举的,但是wrong了,但是枚举完就很明白这个题了。这个题算是我UVA上用时排名最靠前的一个题了,第四,酸爽。。。

//

模拟:

模拟主要是题意难懂, 题意不懂根本就没发做, 这个题神坑就是将对帅直接no,无语。

如果题意懂了 模拟应该就是很基本的东西了 先写架构 再写 不然最后就很乱了

//

这个题的思路:

一个子最多有四个位置可走, 红方封死四个位置, 胜

感觉这个代码赛场写成这样就是傻, 不过自己看感觉还行

//

    #include<stdio.h>  
    #include<stdlib.h>  
    #include<string.h>  
    #include<math.h>  
    #define MAX_SIZE 11  
    typedef struct  
    {  
        char ch;  
        int x;  
    }Chessman;  
    int Calculate(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);  
    int Calculate_General(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);  
    int Calculate_Chariot(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);  
    int Calculate_Cannon(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);  
    int Calculate_Horse(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y);  
    int main()  
    {  
        Chessman Chess[MAX_SIZE][MAX_SIZE];  
        int black_x,black_y,red_x,red_y,result,result1,result2,result3,result4;  
        int N,i,x,y;  
        char ch[10];  
        while(1)  
        {  
            for(x=1;x<=10;x++)for(y=1;y<=10;y++){Chess[x][y].x=0;Chess[x][y].ch='\0';}  
            memset(ch,0,sizeof(ch));  
            scanf("%d %d %d",&N,&black_x,&black_y);if(N==0&&black_x==0&&black_y==0)return 0;  
            Chess[black_x][black_y].x=2;  
            for(i=1;i<=N;i++)  
            {  
                scanf("%s%d%d",ch,&x,&y);getchar();  
                if(ch[0]=='G'){Chess[x][y].x=1;Chess[x][y].ch='G';red_x = x;red_y = y;}  
                else {Chess[x][y].x=1;Chess[x][y].ch=ch[0];}  
            }  
            result = Calculate_General(Chess,black_x,black_y,red_y);  
            if(result==1){printf("NO\n");continue;}  
            if(black_x+1>3)result1=1;  
            else result1 = Calculate(Chess,black_x+1,black_y,red_y);  
            if(black_x-1<1)result2=1;  
            else result2 = Calculate(Chess,black_x-1,black_y,red_y);  
            if(black_y-1<4)result3=1;  
            else result3 = Calculate(Chess,black_x,black_y-1,red_y);  
            if(black_y+1>6)result4=1;  
            else result4 = Calculate(Chess,black_x,black_y+1,red_y);  
            int sum=result1+result2+result3+result4;  
            if(sum==4)printf("YES\n");  
            else printf("NO\n");  
        }  
        return 0;  
    }  
    int Calculate_General(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)  
    {  
        int i;  
        for(i=black_x+1;i<=10;i++)  
        {  
            if(Chess[i][black_y].x==2)continue;  
            if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch!='G')break;  
            if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch=='G')return 1;  
        }  
        return 0;  
    }  
    int Calculate_Chariot(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)  
    {  
        int i;  
        for(i=black_x-1;i>=1;i--)  
        {  
            if(Chess[i][black_y].x==2)continue;  
            if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch!='R')break;  
            if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch=='R')return 1;  
        }  
        for(i=black_x+1;i<=10;i++)  
        {  
            if(Chess[i][black_y].x==2)continue;  
            if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch!='R')break;  
            if(Chess[i][black_y].x!=0&&Chess[i][black_y].ch=='R')return 1;  
        }  
        for(i=black_y-1;i>=1;i--)  
        {  
            if(Chess[black_x][i].x==2)continue;  
            if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch!='R')break;  
            if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch=='R')return 1;  
        }  
        for(i=black_y+1;i<=9;i++)  
        {  
            if(Chess[black_x][i].x==2)continue;  
            if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch!='R')break;  
            if(Chess[black_x][i].x!=0&&Chess[black_x][i].ch=='R')return 1;  
        }  
        return 0;  
    }  
    int Calculate_Cannon(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)  
    {  
        int i,mark=0;  
        for(i=black_x-1;i>=1;i--)  
        {  
            if(Chess[i][black_y].x==2)continue;  
            if(Chess[i][black_y].x!=0&&mark==0){mark=1;continue;}  
            if(Chess[i][black_y].x!=0&&mark==1)  
            {  
                if(Chess[i][black_y].ch=='C')return 1;  
                else break;  
            }  
        }  
        mark=0;  
        for(i=black_x+1;i<=10;i++)  
        {  
            if(Chess[i][black_y].x==2)continue;  
            if(Chess[i][black_y].x!=0&&mark==0){mark=1;continue;}  
            if(Chess[i][black_y].x!=0&&mark==1)  
            {  
                if(Chess[i][black_y].ch=='C')return 1;  
                else break;  
            }  
        }  
        mark=0;  
        for(i=black_y-1;i>=1;i--)  
        {  
            if(Chess[black_x][i].x==2)continue;  
            if(Chess[black_x][i].x!=0&&mark==0){mark=1;continue;}  
            if(Chess[black_x][i].x!=0&&mark==1)  
            {  
                if(Chess[black_x][i].ch=='C')return 1;  
                else break;  
            }  
        }  
        mark=0;  
        for(i=black_y+1;i<=9;i++)  
        {  
            if(Chess[black_x][i].x==2)continue;  
            if(Chess[black_x][i].x!=0&&mark==0){mark=1;continue;}  
            if(Chess[black_x][i].x!=0&&mark==1)  
            {  
                if(Chess[black_x][i].ch=='C')return 1;  
                else break;  
            }  
        }  
        return 0;  
    }  
    int Calculate_Horse(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)  
    {  
        if(black_x-2==1)  
        {  
            if(Chess[black_x-2][black_y-1].ch=='H'&&Chess[black_x-1][black_y-1].x==0)  
            return 1;  
            if(Chess[black_x-2][black_y+1].ch=='H'&&Chess[black_x-1][black_y+1].x==0)  
            return 1;  
        }  
        if(black_x-1>=1)  
        {  
            if(Chess[black_x-1][black_y-2].ch=='H'&&Chess[black_x-1][black_y-1].x==0)  
            return 1;  
            if(Chess[black_x-1][black_y+2].ch=='H'&&Chess[black_x-1][black_y+1].x==0)  
            return 1;  
        }  
        if(Chess[black_x+1][black_y-2].ch=='H'&&Chess[black_x+1][black_y-1].x==0)     return 1;  
        if(Chess[black_x+1][black_y+2].ch=='H'&&Chess[black_x+1][black_y+1].x==0)     return 1;  
        if(Chess[black_x+2][black_y-1].ch=='H'&&Chess[black_x+1][black_y-1].x==0)     return 1;  
        if(Chess[black_x+2][black_y+1].ch=='H'&&Chess[black_x+1][black_y+1].x==0)     return 1;  
        return 0;  
    }  
    int Calculate(Chessman Chess[][MAX_SIZE],int black_x,int black_y,int red_y)  
    {  
        int result1 = Calculate_General(Chess,black_x,black_y,red_y);  
        int result2 = Calculate_Chariot(Chess,black_x,black_y,red_y);  
        int result3 = Calculate_Cannon(Chess,black_x,black_y,red_y);  
        int result4 = Calculate_Horse(Chess,black_x,black_y,red_y);  
        int sum = result1+result2+result3+result4;  
        if(sum>=1)return 1;  
        return 0;  
    }  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值