Othello

来源:互联网 发布:床上用品知乎 编辑:程序博客网 时间:2024/04/27 15:14

UVa 220


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

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

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

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

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

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

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

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


#include <stdio.h>#define pc putcharconst 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 ;            }        }    }}


0 0