UVA Othello 围棋

1.跟象棋 注重运用 特定数组 实现四面八方的移动 ;

2.用 递归 寻找 是否被夹住;

部分代码 还需要 精简;


#include

#include
#include
#include
using namespace std;
typedef struct
{
    int a,b;
} ZB;
struct MM
{
    ZB A;
    int x[50][2],ss;
};
struct MM w[100];
int dir[8][2]= {{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};
char Q[10][10];
int C[100][2],Z[100][2],h[100][2],O;
ZB zh(char m,int h,int v,int a,int b,int s)
{
    ZB d;
    char u=m=='W'?'B':'W';
    if(!(h+a>0&&h+a<9&&b+v<9&&b+v>0))
    {
        d.a=d.b=0;
        return d;
    }
    if(Q[h+a][v+b]==u)
    {
        Z[O][0]=h+a;
        Z[O][1]=v+b;
        O++;
        d=zh(m,h+a,v+b,a,b,++s);
    }
    else if(Q[h+a][v+b]=='-')
    {
        if(s==0)
        {
            d.a=d.b=0;
            return d;
        }
        else
        {
            d.a=h+a;
            d.b=v+b;
            return d;
        }
    }
    else if(Q[h+a][v+b]==m)
    {
        d.a=d.b=0;
        return d;
    }
    return d;
}
void sortt(int s)
{
    int a,b;
    for(int i=0; i         for(int j=i+1; j         {
            if(h[i][0]>h[j][0])
            {
                a=h[i][0];
                b=h[i][1];
                h[i][0]=h[j][0];
                h[i][1]=h[j][1];
                h[j][0]=a;
                h[j][1]=b;
            }
            else if(h[i][0]==h[j][0]&&h[i][1]>h[j][1])
            {
                a=h[i][0];
                b=h[i][1];
                h[i][0]=h[j][0];
                h[i][1]=h[j][1];
                h[j][0]=a;
                h[j][1]=b;
            }
        }
}
int tol(char q)
{
    int sum=0;
    for(int i=1; i<=8; i++)
        for(int j=1; j<=8; j++)
            if(Q[i][j]==q)
            {
                C[sum][0]=i;
                C[sum][1]=j;
                sum++;
            }
    return sum;
}
int chr(char z,int m )
{
    ZB s;
    int f=0,o=0;
    for(int i=0; i         for(int j=0; j<8; j++)
        {
            memset(Z,0,sizeof(Z));
            O=0;
            s=zh(z,C[i][0],C[i][1],dir[j][0],dir[j][1],0);
            if(s.a)
            {
                o=0;
                h[f][0]=w[f].A.a=s.a;
                h[f][1]=w[f].A.b=s.b;
                for(int q=0; q                 {
                    w[f].x[o][0]=Z[q][0];
                    w[f].x[o][1]=Z[q][1];
                    o++;
                }
                w[f].ss=o;
                f++;
            }
        }
    if(!f) return 0;
    sortt(f);
    return f;
}
void shuchu(int s)
{
    int a,b;
    for(int i=0; i     {
        if(i==0)
        {
            a=h[i][0];
            b=h[i][1];
            printf("(%d,%d)",h[i][0],h[i][1]);
        }
        else
        {
            if(a==h[i][0]&&b==h[i][1])
                continue;
            else
            {
                printf(" (%d,%d)",h[i][0],h[i][1]);
                a=h[i][0];
                b=h[i][1];
            }
        }
    }
    printf("\n");
}
void xia(int a,int b,int d,char c)
{
    Q[a][b]=c;
    for(int i=0; i         if(w[i].A.a==a&&w[i].A.b==b)
            for(int j=0; j                 Q[w[i].x[j][0]][w[i].x[j][1]]=c;
}
int shu(char c)
{
    int sum=0;
    for(int i=1; i<=8; i++)
        for(int j=1; j<=8; j++)
            if(Q[i][j]==c)
                sum++;
    return sum;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        for(int i=1; i<=8; i++)
            for(int j=1; j<=8; j++)
                cin>>Q[i][j];
        char D[10],f;
        int d;
        while(cin>>D)
        {
            if(D[0]=='W'||D[0]=='B')
                f=D[0];
            if(D[0]=='M')
            {
                int h1,v1;
                h1=D[1]-48;
                v1=D[2]-48;
                int sum=tol(f);
                d=chr(f,sum);
                if(!d)
                {
                    char x=f=='W'?'B':'W';
                    int sum=tol(x);
                    d=chr(x,sum);
                    xia(h1,v1,d,x);
                }
                else
                {
                    xia(h1,v1,d,f);
                    f=f=='W'?'B':'W';
                }
                int bla,whi;
                bla=shu('B');
                whi=shu('W');
                printf("Black -%3d White -%3d\n",bla,whi);
            }
            if(D[0]=='L')
            {
                int sum=tol(f);
                d=chr(f,sum);
                if(!d) printf("No legal move.\n");
                else shuchu(d);
            }
            if(D[0]=='Q')
            {
                for(int i=1; i<=8; i++)
                {
                    for(int j=1; j<=8; j++)
                        cout<                     cout<                 }
                break;
            }
        }
        if(T) cout<     }
    return 0;
}

你可能感兴趣的:(算法入门经典)