Othello

UVa 220


这道题体现的就是操作和题目的理解能力,

操作其实不难,主要是要理解题目,输出的

时候注意个数就可以了,在输出白色和黑色有

多少个时,每个数字占两位(%2d),能走的坐标

只有中间有一个空格,换行是每组数据之间一个

换行,当一方在某个坐标上下棋时,如果不能使

对方换颜色,那么就变为对方走,每次下子后,

下棋人变化,其他的就是一个个操作就行了。


#include <stdio.h>
#define pc putchar
const int maxn = 10, N = 8;
int map[maxn][maxn], val[2];
char str[maxn][maxn];
int dx[8] = { -1, -1, -1, 0, 0, 1, 1, 1 }, dy[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
void print ( )
{
    for ( int i = 1; i <= N; i ++ )
    {
        for ( int j = 1; j <= N; j ++ )
        {
            if ( map[i][j] == 0 )
                pc ( 'B' ); //将0转,下面是将b变0
            if ( map[i][j] == -1 )
                pc ( '-' );
            if ( map[i][j] == 1 )
                pc ( 'W' );
        }
        pc ( '\n' );
    }
}
int border ( int x, int y ) //边界
{
    return x < 1 || x > N || y < 1 || y > N;
}
int is_ok ( int x, int y, int begin )
{
    for ( int i = 0; i < 8; i ++ )
    {
        int cnt = 0, ok = 0;
        for ( int j = 1; j <= N; j ++ )
        {
            int nx = x+dx[i]*j, ny = y+dy[i]*j;
            if ( border ( nx, ny ) || map[nx][ny] == -1 )
                break ;
            if ( map[nx][ny] == begin )
            {
                ok = 1;
                break ;
            }
            cnt ++;
        }
        if ( cnt && ok )
            return 1;
    }
    return 0;
}
void palce ( int bg )
{
    int flag = 0;
    for ( int i = 1; i <= N; i ++ )
    {
        for ( int j = 1; j <= N; j ++ )
        {
            if ( map[i][j] != -1 )
                continue ;
            if ( is_ok ( i, j, bg ) )
                printf ( flag ++ == 0 ? "(%d,%d)" : " (%d,%d)", i, j );
        }
    }
    if ( ! flag )   //当个数为0时
        printf ( "No legal move." );
    printf ( "\n" );
}
void statis ( ) //统计个数
{
    val[0] = val[1] = 0;
    for ( int i = 1; i <= N; i ++ )
    {
        for ( int j = 1; j <= N; j ++ )
        {
            if ( map[i][j] == -1 )
                continue ;
            int v = map[i][j];
            val[v] ++;
        }
    }
}
void change ( int x, int y, int begin ) //将所有能变色的棋子变色
{
    int pos[N << 1][2], cnt, ok;
    for ( int i = 0; i < 8; i ++ )
    {
        cnt = ok = 0;
        for ( int j = 1; j <= N; j ++ )
        {
            int nx = x+dx[i]*j, ny = y+dy[i]*j;
            if ( border ( nx, ny ) || map[nx][ny] == -1 )
                break ;
            if ( map[nx][ny] == begin )
            {
                ok = 1;
                break ;
            }
            pos[cnt][0] = nx, pos[cnt ++][1] = ny;
        }
        if ( cnt && ok )    //只有当个数不为0且碰到相同颜色的棋子
        {
            for ( int j = 0; j < cnt; j ++ )
            {
                int tx = pos[j][0], ty = pos[j][1];
                map[tx][ty] = begin;
            }
        }
    }
}
int main ( )
{
    int T, r, c, cas = 0, begin;
    char op[N];
    //freopen ( "in0.in", "r", stdin );
    scanf ( "%d", &T );
    while ( T -- )
    {
        for ( int i = 1; i <= N; i ++ )
        {
            scanf ( "%s", str[i] );
            for ( int j = 0; j < N; j ++ )
            {
                if ( str[i][j] == 'B' )
                    map[i][j+1] = 0;
                if ( str[i][j] == 'W' )
                    map[i][j+1] = 1;
                if ( str[i][j] == '-' )
                    map[i][j+1] = -1;
            }
        };
        if ( cas ++ )
            printf ( "\n" );
        scanf ( "%s", op );
        if ( op[0] == 'B' )
            begin = 0;
        else
            begin = 1;
        while ( ~ scanf ( "%s", op ) )
        {
            if ( op[0] == 'Q' )
            {
                print ( );
                break ;
            }
            switch ( op[0] )
            {
            case 'L' :
                palce ( begin );
                break ;
            case 'M' :
                r = op[1]-'0';
                c = op[2]-'0';
                if ( ! is_ok ( r, c, begin ) )
                    begin = ! begin;    //当此点另一种棋子没法走时,换另一个棋子走
                if ( map[r][c] == -1 )
                {
                    change ( r, c, begin );
                    map[r][c] = begin;
                }
                begin = ! begin;    //走完就要换人走
                statis ( );
                printf ( "Black - %2d White - %2d\n", val[0], val[1] );
                //注意这里是%2d
                break ;
            }
        }
    }
}


你可能感兴趣的:(Othello)