UVa 220 - Othello

昨天上毛概Ac了UVa-201之后开始想的,又是上毛概时Ac的。今天程序老师有事,除了晚自习毛概,一整天没课。上午打了会代码,中午宿舍聚餐,下午睡了会起来就发现该上晚自习了。思路还是建数组,标记棋盘。代码写了很长,原本感觉运行时间也会很长,结果Run Time仅为0.009,应该是在代码中加了很多break和提前return的缘故。虽然没超时,但感觉代码实在太长了,以后写代码尽量优化结构,让代码短一点。WA了一次因为没考虑一次落子夹住多枚的情况。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#define maxn 10
using namespace std;
char a[maxn][maxn],x;
int n,w;
char now,nex;
void get_chessboard()
{
    getchar();
    memset(a,0,sizeof(a));
    for(int i=0;i<8;i++)
        gets(a[i]);
    char c=getchar();
    now='W';
    nex='B';
    if(c=='B')
        swap(now,nex);
}
int is_legal_judge(int i,int j,int u)
{
    int z=0;
    if(a[i-1][j-1]==nex&&i-1>=0&&j-1>=0)
    {
        for(int k=2;i-k>=0&&j-k>=0;k++)
        {
            if(a[i-k][j-k]==nex)
                continue;
            else if(a[i-k][j-k]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i-l][j-l]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    if(a[i-1][j]==nex&&i-1>=0)
    {
        for(int k=2;i-k>=0;k++)
        {
            if(a[i-k][j]==nex)
                continue;
            else if(a[i-k][j]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i-l][j]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    if(a[i-1][j+1]==nex&&i-1>=0&&j+1<=8)
    {
        for(int k=2;i-k>=0&&j+k<=8;k++)
        {
            if(a[i-k][j+k]==nex)
                continue;
            else if(a[i-k][j+k]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i-l][j+l]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    if(a[i][j-1]==nex&&j-1>=0)
    {
        for(int k=2;j-k>=0;k++)
        {
            if(a[i][j-k]==nex)
                continue;
            else if(a[i][j-k]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i][j-l]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    if(a[i][j+1]==nex&&j+1<=8)
    {
        for(int k=2;j+k<=8;k++)
        {
            if(a[i][j+k]==nex)
                continue;
            else if(a[i][j+k]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i][j+l]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    if(a[i+1][j-1]==nex&&i+1<=8&&j-1>=0)
    {
        for(int k=2;i+k<=8&&j-k>=0;k++)
        {
            if(a[i+k][j-k]==nex)
                continue;
            else if(a[i+k][j-k]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i+l][j-l]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    if(a[i+1][j]==nex&&i+1<=8)
    {
        for(int k=2;i+k<=8;k++)
        {
            if(a[i+k][j]==nex)
                continue;
            else if(a[i+k][j]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i+l][j]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    if(a[i+1][j+1]==nex&&i+1<=8&&j+1<=8)
    {
        for(int k=2;i+k<=8&&j+k<=8;k++)
        {
            if(a[i+k][j+k]==nex)
                continue;
            else if(a[i+k][j+k]==now)
            {
                if(u)
                {
                    for(int l=1;l<k;l++)
                        a[i+l][j+l]=now;
                    break;
                }
                return 1;
            }
            else
                break;
        }
    }
    return z;
}
int is_legal(int is_print)
{
    int p=0,first=1;
    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
        {
            if(a[i][j]=='-')
            {
                if(is_legal_judge(i,j,0))
                {
                    if(is_print)
                    {
                        if(first)
                            first=0;
                        else
                            cout<<" ";
                        cout<<"("<<i+1<<","<<j+1<<")";
                    }
                    p++;
                }
            }
        }
    }
    if(p&&is_print)
        cout<<endl;
    else if(!p&&is_print)
        cout<<"No legal move."<<endl;
    return p;
}
int cnt(char l)
{
    int k=0;
    for(int i=0;i<8;i++)
        for(int j=0;j<8;j++)
            if(a[i][j]==l)
                k++;
    return k;
}
void M()
{
    int y,z;
    cin>>y;
    z=y%10;
    y/=10;
    y--;
    z--;
    if(!is_legal(0))
        swap(now,nex);
    is_legal_judge(y,z,1);
    a[y][z]=now;
    cout<<"Black - "<<setw(2)<<cnt('B')<<" White - "<<setw(2)<<cnt('W')<<endl;
    swap(now,nex);
}
void print_chessboard()
{
    for(int i=0;i<8;i++)
        cout<<a[i]<<endl;
}
int main()
{
    cin>>n;
    while(n--)
    {
        get_chessboard();
        char c;
        while(cin>>c)
        {
            if(c=='L')
                is_legal(1);
            else if(c=='M')
                M();
            else if(c=='Q')
            {
                print_chessboard();
                break;
            }
        }
        if(n)
            cout<<endl;
    }
    return 0;
}


你可能感兴趣的:(uva)