1. 程式人生 > >uva 220 Othello

uva 220 Othello

未A,但是測試了好多資料,沒有找出錯誤。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
using namespace std;
char board[10][10];
char FirstStep;
int adj[9][9];
int countW=0,countB=0;
int num=0;
int n;
//存放合法路徑
typedef struct{
    int x,y;
    int size;
}legalmove;
legalmove moves[1005];
//讀取棋盤
void ReadBoard()
{
    for(int i=1;i<=8;i++)
    {
        for(int j=1;j<=8;j++)
        {
            cin>>board[i][j];
        }
    }
    cin>>FirstStep;
}
//往上找符合條件的位置
void L_up(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=i-1;k>=1;k--)
    {
        if(board[k][j]==c) cnt++;
        if(board[k][j]=='-'&&cnt)
        {
            moves[moves->size].x=k;
            moves[moves->size].y=j;
            moves->size++;
            break;
        }
        if(!cnt&&board[k][j]=='-') break;
        if(board[k][j]==ch) break;
    }
}
//往下找符合條件的位置
void L_down(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=i+1;k<=8;k++)
    {
        if(board[k][j]==c) cnt++;
        if(board[k][j]=='-'&&cnt)
        {
            moves[moves->size].x=k;
            moves[moves->size].y=j;
            moves->size++;
            break;
        }
        if(!cnt&&board[k][j]=='-') break;
        if(board[k][j]==ch) break;
    }
}
//往左找符合條件的位置
void L_left(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=j-1;k>=1;k--)
    {
        if(board[i][k]==c) cnt++;
        if(board[i][k]=='-'&&cnt)
        {
            moves[moves->size].x=i;
            moves[moves->size].y=k;
            moves->size++;
            break;
        }
        if(!cnt&&board[i][k]=='-') break;
        if(board[i][k]==ch) break;
    }
}
//往右找符合條件的位置
void L_right(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=j+1;k<=8;k++)
    {
        if(board[i][k]==c) cnt++;
        if(board[i][k]=='-'&&cnt)
        {
            moves[moves->size].x=i;
            moves[moves->size].y=k;
            moves->size++;
            break;
        }
        if(!cnt&&board[i][k]=='-') break;
        if(board[i][k]==ch) break;
    }
}
//往左上找符合條件的位置
void L_upandleft(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=1;i-k>=1&&j-k>=1;k++)
    {
        if(board[i-k][j-k]==c) cnt++;
        if(board[i-k][j-k]=='-'&&cnt)
        {
            moves[moves->size].x=i-k;
            moves[moves->size].y=j-k;
            moves->size++;
            break;
        }
        if(!cnt&&board[i-k][j-k]=='-') break;
        if(board[i-k][j-k]==ch) break;
    }
}
//往右上找符合條件的位置
void L_upandright(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=1;i-k>=1&&j+k<=8;k++)
    {
        if(board[i-k][j+k]==c) cnt++;
        if(board[i-k][j+k]=='-'&&cnt)
        {
            moves[moves->size].x=i-k;
            moves[moves->size].y=j+k;
            moves->size++;
            break;
        }
        if(!cnt&&board[i-k][j+k]=='-') break;
        if(board[i-k][j+k]==ch) break;
    }
}
//往左下找符合條件的位置
void L_downandleft(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=1;i+k<=8&&j-k>=1;k++)
    {
        if(board[i+k][j-k]==c) cnt++;
        if(board[i+k][j-k]=='-'&&cnt)
        {
            moves[moves->size].x=i+k;
            moves[moves->size].y=j-k;
            moves->size++;
            break;
        }
        if(!cnt&&board[i+k][j-k]=='-') break;
        if(board[i+k][j-k]==ch) break;
    }
}
//往右下找符合條件的位置
void L_downandright(int i,int j,char ch,char c)
{
    int cnt=0;
    for(int k=1;i+k<=8&&j+k<=8;k++)
    {
        if(board[i+k][j+k]==c) cnt++;
        if(board[i+k][j+k]=='-'&&cnt)
        {
            moves[moves->size].x=i+k;
            moves[moves->size].y=j+k;
            moves->size++;
            break;
        }
        if(!cnt&&board[i+k][j+k]=='-') break;
        if(board[i+k][j+k]==ch) break;
    }
}
void sortmoves()
{
    for(int i=1;i<=8;i++)
        memset(adj[i],0,sizeof(adj[i]));
    for(int i=0;i<moves->size;i++)
        adj[moves[i].x][moves[i].y]=1;
}
void listlegalmoves()
{
    if(moves->size==0) printf("No legal move.\n");
    else
    {
        for(int i=1;i<=8;i++)
        {
            for(int j=1;j<=8;j++)
            {
                if(adj[i][j]) printf("(%d,%d)",i,j);
            }
        }
        printf("\n");
    }
}
//如果命令是L
void Cmd_isL(char ch)
{
    char c;
    if(ch=='W') c='B';
    else c='W';
    for(int i=1;i<=8;i++)
    {
        for(int j=1;j<=8;j++)
        {
            if(board[i][j]==ch)
            {
                L_up(i,j,ch,c);
                L_down(i,j,ch,c);
                L_left(i,j,ch,c);
                L_right(i,j,ch,c);
                L_upandleft(i,j,ch,c);
                L_upandright(i,j,ch,c);
                L_downandleft(i,j,ch,c);
                L_downandright(i,j,ch,c);
            }
        }
    }
    sortmoves();
    listlegalmoves();
}
//把上面的棋子變色
void changecolor_up(int a,int b,char ch,char c)
{
    int k;
    for(k=a-1;k>=1;k--)
    {
        if(board[k][b]==ch) break;
        if(board[k][b]=='-') return ;
        if(k==1) return ;
    }
    if(k!=a-1)
    {
        for(int i=a-1;i>k;i--)
            board[i][b]=ch;
    }
}
//把下面的棋子變色
void changecolor_down(int a,int b,char ch,char c)
{
    int k;
    for(k=a+1;k<=8;k++)
    {
        if(board[k][b]==ch) break;
        if(board[k][b]=='-') return ;
        if(k==8) return ;
    }
    if(k!=a+1)
    {
        for(int i=a+1;i<k;i++)
            board[i][b]=ch;
    }
}
//把左邊的棋子變色
void changecolor_left(int a,int b,char ch,char c)
{
    int k;
    for(k=b-1;k>=1;k--)
    {
        if(board[a][k]==ch) break;
        if(board[a][k]=='-') return ;
        if(k==1) return ;
    }
    if(k!=b-1)
    {
        for(int i=b-1;i>k;i--)
            board[a][i]=ch;
    }
}
//把右邊的棋子變色
void changecolor_right(int a,int b,char ch,char c)
{
    int k;
    for(k=b+1;k<=8;k++)
    {
        if(board[a][k]==ch) break;
        if(board[a][k]=='-') return ;
        if(k==8) return ;
    }
    if(k!=b+1)
    {
        for(int i=b+1;i<k;i++)
            board[a][i]=ch;
    }
}
//把左上的棋子變色
void changecolor_upandleft(int a,int b,char ch,char c)
{
    int k;
    for(k=1;a-k>=1&&b-k>=1;k++)
    {
        if(board[a-k][b-k]==ch) break;
        if(board[a-k][b-k]=='-') return ;
        if(a-k==1||b-k==1) return ;
    }
    for(int i=1;i<k;i++)
        board[a-i][b-i]=ch;
}
//把右上的棋子變色
void changecolor_upandright(int a,int b,char ch,char c)
{
    int k;
    for(k=1;a-k>=1&&b+k<=8;k++)
    {
        if(board[a-k][b+k]==ch) break;
        if(board[a-k][b+k]=='-') return ;
        if(a-k==1||b+k==8) return ;
    }
    for(int i=1;i<k;i++)
        board[a-i][b+i]=ch;
}
//把左下的棋子變色
void changecolor_downandleft(int a,int b,char ch,char c)
{
    int k;
    for(k=1;a+k<=8&&b-k>=1;k++)
    {
        if(board[a+k][b-k]==ch) break;
        if(board[a+k][b-k]=='-') return;
        if(a+k==8||b-k==1) return ;
    }
    for(int i=1;i<k;i++)
        board[a+i][b-i]=ch;
}
//把右下的棋子變色
void changecolor_downandright(int a,int b,char ch,char c)
{
    int k;
    for(k=1;a+k<=8&&b+k<=8;k++)
    {
        if(board[a+k][b+k]==ch) break;
        if(board[a+k][b+k]=='-') return ;
        if(a+k==8||b+k==8) return ;
    }
    for(int i=1;i<k;i++)
        board[a+i][b+i]=ch;
}
//把夾住的棋子變色
void changecolor(int a,int b,char ch,char c)
{
    changecolor_up(a,b,ch,c);
    changecolor_down(a,b,ch,c);
    changecolor_left(a,b,ch,c);
    changecolor_right(a,b,ch,c);
    changecolor_upandleft(a,b,ch,c);
    changecolor_upandright(a,b,ch,c);
    changecolor_downandleft(a,b,ch,c);
    changecolor_downandright(a,b,ch,c);
}
//數黑白棋個數
void count_WandB()
{
    for(int i=1;i<=8;i++)
    {
        for(int j=1;j<=8;j++)
        {
            if(board[i][j]=='W') countW++;
            if(board[i][j]=='B') countB++;
        }
    }
}
//如果命令是M
char Cmd_isM(char ch,int a,int b)
{
    int cnt=0;
    for(int i=0;i<moves->size;i++)
    {
        if(moves[i].x==a&&moves[i].y==b) cnt++;
    }
    if(!cnt)
    {
        if(ch=='W') ch='B';
        else ch='W';
    }
    board[a][b]=ch;
    char c;
    if(ch=='W') c='B';
    else c='W';
    changecolor(a,b,ch,c);
    count_WandB();
    printf("Black-%2dWhite-%2d\n",countB,countW);
    return ch;
}
//如果命令是Q
void Cmd_isQ()
{
    for(int i=1;i<=8;i++)
    {
        for(int j=1;j<=8;j++)
        {
            printf("%c",board[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        moves->size=0;
        countW=0;
        countB=0;
        string cmd;
        char ch;
        ReadBoard();
        cin>>cmd;
        ch=FirstStep;
        while(cmd[0]!='Q')
        {
            if(cmd[0]=='L') Cmd_isL(ch);
            if(cmd[0]=='M') {
                ch=Cmd_isM(ch,cmd[1]-'0',cmd[2]-'0');
                if(ch=='W') ch='B';
                else ch='W';
                moves->size=0;
                countW=0;
                countB=0;
            }
            cin>>cmd;
        }
        if(cmd[0]=='Q') Cmd_isQ();
    }
    return 0;
}