• UVA


    最害怕这种下棋的题了,情况特别多,考差细节特别多,当时没做,现在翻过头来再看一下,顺便复习一下基础。

    这道题要注意格式,输出统计黑白棋子数的时候,数要占两位。其他都是普通的思路,顺着题目要求即可。

    寒假刚刚开始,是提高自我的好时间,希望自己能利用起来。


    #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.
    ");
        else printf("
    ");
    }
    
    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
    ", 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("
    ");
        }
        return 0;
    }



  • 相关阅读:
    EntityFramework之创建数据库及基本操作(一)
    Entity Framework Code First (八)迁移 Migrations
    [转]Tomcat启动报错:AnnotationConfigBeanDefinitionParser are only available on JDK 1.5 and higher
    [转]bootstrap table本地数据使用方法
    [转]MySQL-5.7 Update语句详解
    [转]操作MySQL数据库报出:Parameter index out of range (1 > number of parameters, which is
    [转]在MySQL中创建实现自增的序列(Sequence)的教程
    [转]MySQL如何设置自动增长序列 SEQUENCE
    [转]Mustache 使用心得总结
    [转]关于重定向RedirectAttributes的用法
  • 原文地址:https://www.cnblogs.com/kunsoft/p/5312740.html
Copyright © 2020-2023  润新知