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



  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值