UVA - 220 - Othello
最害怕这种下棋的题了,情况特别多,考差细节特别多,当时没做,现在翻过头来再看一下,顺便复习一下基础。
这道题要注意格式,输出统计黑白棋子数的时候,数要占两位。其他都是普通的思路,顺着题目要求即可。
寒假刚刚开始,是提高自我的好时间,希望自己能利用起来。
#include <bits/stdc++.h> using namespace std; char tab[10][10]; const int dir[8][2] = {-1, 0, 1, 0, 0, -1, 0, 1, -1, -1, -1, 1, 1, -1, 1, 1}; char now(const int beg, const bool flag) { if(beg=='B'){ if(flag) return 'B'; else return 'W'; } if(beg=='W'){ if(flag) return 'W'; else return 'B'; } } bool hefa(const int r, const int c, const char x) { char y; if(x=='B') y = 'W'; if(x=='W') y = 'B'; if(tab[r][c]!='-') return false; for(int i = 0; i < 8; i++){ int rr = r, cc = c, dr = dir[i][0], dc = dir[i][1]; if(tab[rr+dr][cc+dc]==y){ while(true){ rr += dr; cc += dc; if(tab[rr][cc]==x) return true; if(tab[rr][cc]=='-' || tab[rr][cc]==0) break; } } } return false; } void L(char x) { int flag = 0; for(int i = 1; i <= 8; i++) for(int j = 1; j <= 8; j++){ if(hefa(i, j, x)){ if(flag++) printf(" (%d,%d)", i, j); else printf("(%d,%d)", i, j); } } if(!flag) printf("No legal move.\n"); else printf("\n"); } void out_cnt() { int cnt1 = 0, cnt2 = 0; for(int i = 1; i <= 8; i++){ for(int j = 1; j <= 8; j++){ if(tab[i][j]=='B') cnt1++; if(tab[i][j]=='W') cnt2++; } } printf("Black - %2d White - %2d\n", cnt1, cnt2); } void Mrc(const int r, const int c, const char x) { char y; if(x=='B') y = 'W'; if(x=='W') y = 'B'; tab[r][c] = x; for(int i = 0; i < 8; i++){ bool ok = false; int rr = r, cc = c, dr = dir[i][0], dc = dir[i][1]; if(tab[rr+dr][cc+dc]==y){ while(true){ rr += dr; cc += dc; if(tab[rr][cc]==x){ ok = true; break; } if(tab[rr][cc]=='-' || tab[rr][cc]==0) break; } } if(ok){ rr = r, cc = c; while(true){ rr += dr; cc += dc; if(tab[rr][cc]==x) break; else tab[rr][cc] = x; } } } out_cnt(); } void print() { for(int i = 1; i <= 8; i++) puts(tab[i]+1); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); int T; cin >> T; cin.get(); for(int t = 1; t <= T; t++){ memset(tab, 0, sizeof(tab)); for(int i = 1; i <= 8; i++) scanf("%s", tab[i]+1); char beg, x; cin >> beg; bool flag = true; string cmd; while(cin >> cmd){ if(cmd=="L") L(now(beg, flag)); else if(cmd[0]=='M'){ int r = cmd[1]-'0', c = cmd[2]-'0'; if(!hefa(r, c, now(beg, flag))){ flag = !flag; Mrc(r, c, now(beg, flag)); } else Mrc(r, c, now(beg, flag)); flag = !flag; } else if(cmd=="Q"){ print(); break; } } if(t != T) printf("\n"); } return 0; }