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 ; } } } }