UVA-1589 Xiangqi

以前做的题,写的丑,肯定可以优化,但是做过的题不想再看了,直接粘代码。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int f[11][10]={},ri[41]={},rj[41]={};
int num,bi,bj;
char c[41]={};
int judge(int i,int j);
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(cin>>num>>bi>>bj)
    {
        if(num==0&&bi==0&&bj==0)
            break;
        memset(f,0,sizeof(f));
        memset(ri,0,sizeof(ri));
        memset(rj,0,sizeof(rj));
        for(int i=1;i<=num;i++)
        {
            cin>>c[i]>>ri[i]>>rj[i];
            f[ri[i]][rj[i]]=i;
        }
        int flag=0;
        if(bi-1>=1&&!flag)
            flag=judge(bi-1,bj);
        if(bi+1<=3&&!flag)
            flag=judge(bi+1,bj);
        if(bj-1>=4&&!flag)
            flag=judge(bi,bj-1);
        if(bj+1<=6&&!flag)
            flag=judge(bi,bj+1);
        if(flag==1)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
        string s;
        getline(cin,s);
    }
}
int judge(int x,int y)
{
    if(f[x][y]!=0)
    {
        c[f[x][y]]=' ';
        f[x][y]=-1;
    }
    for(int i=1;i<=num;i++)
    {
        if(c[i]=='G')
        {
            if(rj[i]==y)
            {
                int sum=0;
                for(int ii=bi+1;ii<=ri[i]-1;ii++)
                {
                    if(f[ii][y]>0)
                        sum++;
                }
                if(sum==0)
                    return 0;
            }
        }
        if(c[i]=='R')
        {
            if(ri[i]==x)
            {
                int sum=0;
                if(rj[i]<y-1)
                {
                    for(int ii=rj[i]+1;ii<=y-1;ii++)
                    {
                        if(f[x][ii]>0)
                            sum++;
                    }
                }
                else if(rj[i]>y+1)
                {
                    for(int ii=y+1;ii<=rj[i]-1;ii++)
                    {
                        if(f[x][ii]>0)
                            sum++;
                    }
                }
                if(sum==0)
                    return 0;
            }
            else if(rj[i]==y)
            {
                int sum=0;
                if(ri[i]<x-1)
                {
                    for(int ii=ri[i]+1;ii<x-1;ii++)
                    {
                        if(f[ii][y]>0)
                            sum++;
                    }
                }
                else if(ri[i]>x+1)
                {
                    for(int ii=x+1;ii<=ri[i]-1;ii++)
                    {
                        if(f[ii][y]>0)
                            sum++;
                    }
                }
                if(sum==0)
                    return 0;
            }
        }
        if(c[i]=='H')
        {
            if(f[ri[i]-1][rj[i]]==0)
            {
                if((x==ri[i]-2)&&(y==rj[i]+1||y==rj[i]-1))
                    return 0;
            }
            if(f[ri[i]+1][rj[i]]==0)
            {
                if((x==ri[i]+2)&&(y==rj[i]+1||y==rj[i]-1))
                    return 0;
            }
            if(f[ri[i]][rj[i]-1]==0)
            {
                if((y==rj[i]-2)&&(x==ri[i]+1||x==ri[i]-1))
                    return 0;
            }
            if(f[ri[i]][rj[i]+1]==0)
            {
                if((y==rj[i]+2)&&(x==ri[i]+1||x==ri[i]-1))
                    return 0;
            }
        }
        if(c[i]=='C')
        {
            if(ri[i]==x)
            {
                int sum=0;
                if(rj[i]<y-1)
                {
                    for(int ii=rj[i]+1;ii<=y-1;ii++)
                    {
                        if(f[x][ii]>0)
                            sum++;
                    }
                }
                else if(rj[i]>y+1)
                {
                    for(int ii=y+1;ii<=rj[i]-1;ii++)
                    {
                        if(f[x][ii]>0)
                            sum++;
                    }
                }
                if(sum==1)
                    return 0;
            }
            else if(rj[i]==y)
            {
                int sum=0;
                if(ri[i]<x-1)
                {
                    for(int ii=ri[i]+1;ii<x-1;ii++)
                    {
                        if(f[ii][y]>0)
                            sum++;
                    }
                }
                else if(ri[i]>x+1)
                {
                    for(int ii=x+1;ii<=ri[i]-1;ii++)
                    {
                        if(f[ii][y]>0)
                            sum++;
                    }
                }
                if(sum==1)
                    return 0;
            }
        }
    }
    return 1;
}
原文地址:https://www.cnblogs.com/windrises/p/4653048.html