Othello UVA - 220

题目链接: https://vjudge.net/problem/UVA-220

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
题目大意:你的任务是模拟黑白棋游戏的进程。黑白棋的规则:黑白双方轮流放棋子,每次必须让新放的棋子“夹住”至少一枚对方的棋子,然后把所有被新放的棋子“夹住”的对方棋子替换为己方棋子。一段连续(横,竖或者斜向)的同色棋子被“夹住”的条件是两端都是对方棋子(不能是空位)。注意:只有被新放的棋子夹住才会被替换。
输入:输入一个8*8的棋盘以及当前下一个操作的游戏者,处理3中命令:

  • L指令打印所有合法操作,按照从上到下,从左到右的顺序排列(没有合法操作时输出No legal move)。
  • Mrc指令放一枚棋子在(r,c)。如果当前游戏者没有合法操作,则先切换游戏者再操作。输入保证这个操作是合法的。输出操作完毕后黑白方棋子总数,
  • Q指令退出游戏,并打印当前棋盘(格式同输入)。

分析:细节模拟题。常规思路便是疯狂遍历棋盘(二维数组),疯狂使用while()if()从上下左右,斜向上下左右来判断当前能否放置棋子,当前能否替换棋子。这道题的细节也特别多:1,黑白棋子输出后面无多余空格。2,轮换放置棋子,一次M指令后就要换对方放置棋子。3,输出黑白棋子数的时候数字%2d输出。
要加强自己细节模拟的能力!
AC代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
char str[20][20];
int arr[20][20];
char user, user2;
int Mark() {
    for(int i = 0; i < 8; i++) {
        for(int j = 0; j < 8; j++) {
            int t1 = i;
            int t2 = j;
            if(str[i][j]==user) {
                while(--t1>0 && (str[t1][j]==user2 || str[t1][j]==user));
                if(t1>=0 && str[t1][j]=='-' && str[t1+1][j]==user2)
                    arr[t1][j] = 0;
                t1 = i;
                while(++t1<7 && (str[t1][j]==user2 || str[t1][j]==user));
                if(t1<=7 && str[t1][j]=='-' && str[t1-1][j]==user2)
                    arr[t1][j] = 0;
                while(--t2>0 && (str[i][t2]==user || str[i][t2]==user2));
                if(t2>=0 && str[i][t2]=='-' && str[i][t2+1]==user2)
                    arr[i][t2] = 0;
                t2 = j;
                while(++t2<7 && (str[i][t2]==user || str[i][t2]==user2));
                if(t2<=7 && str[i][t2]=='-' && str[i][t2-1]==user2)
                    arr[i][t2] = 0;
                t1 = i, t2 = j;
                while(++t1,++t2>0 && t1<7 && t2<7 && (str[t1][t2]==user || str[t1][t2]==user2));
                if(t1<=7 && t2<=7 && str[t1][t2]=='-' && str[t1-1][t2-1]==user2)
                    arr[t1][t2] = 0;
                t1 = i, t2 = j;
                while(--t1,++t2>0 && t1>0 && t2<7 && (str[t1][t2]==user || str[t1][t2]==user2));
                if(t1>=0 && t2<=7 && str[t1][t2]=='-' && str[t1+1][t2-1]==user2)
                    arr[t1][t2] = 0;
                t1 = i, t2 = j;
                while(++t1,--t2>0 && t1<7 && t2>0 && (str[t1][t2]==user || str[t1][t2]==user2));
                if(t1<=7 && t2>=0 && str[t1][t2]=='-' && str[t1-1][t2+1]==user2)
                    arr[t1][t2] = 0;
                t1 = i, t2 = j;
                while(--t1,--t2 && t1>0 && t2>0 && (str[t1][t2]==user || str[t1][t2]==user2));
                if(t1>=0 && t2>=0 && str[t1][t2]=='-' && str[t1+1][t2+1]==user2) {
                    arr[t1][t2] = 0;
                }
            }
        }
    }
    int flag = 0;
    for(int i = 0; i < 8; i++) {
        for(int j = 0; j < 8; j++)
            if(!arr[i][j]) flag = 1;
    }
    return flag;
}

void L() {
    int flag = Mark(), f = 0;
    if(!flag) printf("No legal move.\n");
    else {
        for(int i = 0; i < 8; i++) {
            for(int j = 0; j < 8; j++) {
                if(!arr[i][j]) {
                    if(!f) {printf("(%d,%d)",i+1,j+1);f = 1;}
                    else printf(" (%d,%d)",i+1,j+1);
                }
            }
        }
        printf("\n");
    }
}


void M() {
    char c;
    int flag = Mark();
    int num,x,y,c1 = 0,c2 = 0;
    cin >> num;
    x = num/10, y = num%10;
    if(!flag) {
        c = user; user = user2; user2 = c;
        str[x-1][y-1] = user;
    }
    else str[x-1][y-1] = user;
    int t1 = x-1, t2 = y-1;
    while(--t1>0 && str[t1][y-1]==user2);
    if(str[t1][y-1]==user) {
        for(int i = t1; i <= x-1; i++)
            str[i][y-1] = user;
    }
    t1 = x-1;
    while(++t1<7 && str[t1][y-1]==user2);
    if(str[t1][y-1]==user) {
        for(int i = x-1; i <= t1; i++)
            str[i][y-1] = user;
    }
    while(--t2>0 && str[x-1][t2]==user2);
    if(str[x-1][t2]==user) {
        for(int i = t2; i <= y-1; i++)
            str[x-1][i] = user;
    }
    t2 = y-1;
    while(++t2<7 && str[x-1][t2]==user2);
    if(str[x-1][t2]==user) {
        for(int i = y-1; i <= t2; i++)
            str[x-1][i] = user;
    }

    t1 = x-1, t2 = y-1;
    while(++t1<7 && ++t2<7 && str[t1][t2]==user2);
    if(str[t1][t2]==user) {
        for(int i = x-1,j = y-1; i <= t1; i++,j++)
            str[i][j] = user;
    }
    t1 = x-1, t2 = y-1;
    while(++t1<7 && --t2>0 && str[t1][t2]==user2);
    if(str[t1][t2]==user) {
        for(int i = x-1,j = y-1; i <= t1; i++,j--)
            str[i][j] = user;
    }
    t1 = x-1, t2 = y-1;
    while(--t1>0 && ++t2<7 && str[t1][t2]==user2);
    if(str[t1][t2]==user) {
        for(int i = x-1,j = y-1; i >= t1; i--,j++)
            str[i][j] = user;
    }
    t1 = x-1, t2 = y-1;
    while(--t1>0 && --t2>0 && str[t1][t2]==user2);
    if(str[t1][t2]==user) {
        for(int i = x-1,j = y-1; i >= t1; i--,j--)
            str[i][j] = user;
    }
    for(int i = 0; i < 8; i++) {
        for(int j = 0; j < 8; j++) {
            if(str[i][j]=='B') c1++;
            else if(str[i][j]=='W') c2++;
        }
    }
    printf("Black - %2d White - %2d\n",c1,c2);
    c = user; user = user2; user2 = c;
    memset(arr, -1, sizeof(arr));
}

int main()
{
    freopen("i.txt","r",stdin);
    int n;
    cin >> n;
    while(n--) {
        memset(arr, -1, sizeof(arr));
        for(int i = 0; i < 8; i++)
            cin >> str[i];
        char ch;
        cin >> user;
        user2 = user=='B'?'W':'B';
        while(cin >> ch) {
            if(ch=='Q') {
                for(int i = 0; i < 8; i++)
                    cout << str[i] << endl;
                break;
            }
            else if(ch=='L')
                L();
            else if(ch=='M')
                M();
        }
        if(n) printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值