最害怕这种下棋的题了,情况特别多,考差细节特别多,当时没做,现在翻过头来再看一下,顺便复习一下基础。
这道题要注意格式,输出统计黑白棋子数的时候,数要占两位。其他都是普通的思路,顺着题目要求即可。
寒假刚刚开始,是提高自我的好时间,希望自己能利用起来。
#include
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;
}