uva 220 - Othello(黑白翻转棋)

原创 2018年04月15日 21:09:27

习题4-3 黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)
你的任务是模拟黑白棋游戏的进程。黑白棋的规则为:黑白双方轮流放棋子,每次必须
让新放的棋子“夹住”至少一枚对方棋子,然后把所有被新放棋子“夹住”的对方棋子替换成己
方棋子。一段连续(横、竖或者斜向)的同色棋子被“夹住”的条件是两端都是对方棋子(不
能是空位)。如图4-6(a)所示,白棋有6个合法操作,分别为(2,3),(3,3),(3,5), (6,2),(7,3),
(7,4)。选择在(7,3)放白棋后变成如图4-6(b)所示效果(注意有竖向和斜向的共两枚黑棋变
白)。注意(4,6)的黑色棋子虽然被夹住,但不是被新放的棋子夹住,因此不变白。
这里写图片描述
(a) (b)
图4-6 黑白棋
输入一个8*8的棋盘以及当前下一次操作的游戏者,处理3种指令:
L指令打印所有合法操作,按照从上到下,从左到右的顺序排列(没有合法操作时输出No legal move)。
Mrc指令放一枚棋子在(r,c)。如果当前游戏者没有合法操作,则是先切换游戏者再操作。输入保证这个操作是合法的。输出操作完毕后黑白方的棋子总数。
Q指令退出游戏,并打印当前棋盘(格式同输入)。
Sample Input
2
——–
——–
——–
—WB—
—BW—
——–
——–
——–
W
L
M35
L
Q
WWWWB—
WWWB—-
WWB—–
WB——
——–
——–
——–
——–
B
L
M25
L
Q
Sample Output
(3,5) (4,6) (5,3) (6,4)
Black - 1 White - 4
(3,4) (3,6) (5,6)
——–
——–
—-W—
—WW—
—BW—
——–
——–
——–
No legal move.
Black - 3 White - 12
(3,5)
WWWWB—
WWWWW—
WWB—–
WB——
——–
——–
——–
——–

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=833&problem=156&mosmsg=Submission+received+with+ID+20901787

挺复杂的题,题目就比较难弄懂,要不是我会玩黑白翻转棋(笑),可能就很难办了吧。
思路:
1、用一个二维数组存储棋盘的状态,
2、通过一个函数来翻转棋子,传进去的两个参数是落子的坐标

#include<iostream>
#include<iomanip>
using namespace std;
char board[10][10];
int yesnum=0;//输出空格的格式
char disk,nodisk;//要走的棋,被翻的棋
//int exceed(int i,int j)//判断越界
//{
//    if(i>=1&&i<=8&&j>=1&&j<=8)
//        return 1;
//    else
//        return 0;
//}
int reverse(int i,int j,int con)//(i,j)上应该是空的
{
    for(int in=-1;in<=1;in++)//八个方位的循环
    {
        for(int jn=-1;jn<=1;jn++)//八个方位的循环用于翻棋子
        {
            if(in==0&&jn==0) continue;//中间的棋不用管它先
//            if(i+in>=1&&i+in<=8&&j+jn>=1&&j+jn<=8&&/*exceed(i+in,j+jn)&&*/
//               board[i+in][j+jn]==nodisk)//可翻  //board[i+in][j+jn]=='-')//有空位能放子
//            {
                //cout<<"board  "<<board[i+in][j+jn]<<endl;
            int n=1;//用于能翻的子的包的界限标志(说不懂,见下面第一个if)
            while((i+in*n>=1&&i+in*n<=8&&j+jn*n>=1&&j+jn*n<=8)&&/*exceed(i-in*n,j-jn*n)*///判断越界
                  board[i+in*n][j+jn*n]==nodisk)//还能继续翻
            {
                n++;
            }
            if(board[i+in*n][j+jn*n]==disk&&n>1)//包住了,就翻这么多
            {
                //cout<<i+in*n<<"_"<<j+jn*n<<"_"<<board[i+in*n][j+jn*n]<<" "<<endl;
                if(con=='L')
                {
                    if(yesnum>0) cout<<" ";
                    cout<<"("<<i<<","<<j<<")";
                    yesnum++;
                    return 0;
                }
                else
                {
                    for(int n2=0;n2<n;n2++)//翻转操作,--n为了不bang掉最后的disk
                    {
                        board[i+in*n2][j+jn*n2]=disk;
                    }
                }
                //break;
            }
            //}
        }
    }
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        for(int i=1;i<=8;i++)//存表
            for(int j=1;j<=8;j++)
                cin>>board[i][j];
        char con;//下一个子,操作
        cin>>disk;
        int Wnum=0,Bnum=0;
        while(cin>>con&&con!='Q')
        {
            if(disk=='W') nodisk = 'B';
            else nodisk = 'W';
            //cout<<"disk "<<disk<<endl;
            if(con=='L')//显示下一步可走子
            {
                yesnum=0;
                for(int i=1;i<=8;i++)//全地图遍历
                {
                    for(int j=1;j<=8;j++)//全地图遍历
                    {
                        if(board[i][j]=='-')//如果可以翻
                        {
                            //cout<<disk<<"  "<<i<<" ij "<<j<<endl;
                            reverse(i,j,'L');
                        }
                    }
                }
                if(!yesnum)
                {
                    cout<<"No legal move.";
                    if(disk=='W') disk='B';
                    else disk = 'W';
                }
                cout<<endl;
            }
            else
            {
                int x;
                cin>>x;
                reverse(x/10,x%10,'M');
                Bnum=Wnum=0;
                for(int i=1;i<=8;i++)
                    for(int j=1;j<=8;j++)
                        if(board[i][j]=='B')
                            Bnum++;
                        else if(board[i][j]=='W')
                            Wnum++;
                cout<<"Black -"<<setw(3)<<Bnum<<" White -"<<setw(3)<<Wnum<<endl;

                if(disk=='W') disk='B';
                else disk = 'W';
            }

        }
        for(int i=1;i<=8;i++)
        {
            for(int j=1;j<=8;j++)
                cout<<board[i][j];
            cout<<endl;
        }
        if(T>=1)
            cout<<endl;
    }
    return 0;
}
//AC at 2018/3/9

(题外话:这个题一个月多前就通过了,但是一直拖到现在才写博客,我都忘了当时遇到的困难和当时的思路了。那时是因为要准备蓝桥杯,所以就没再做这本书上的题了,这一个月里发生了不少事,团队天梯赛,蓝桥杯,清明,英语活动。
又去了两趟医院去看眼睛,对于要靠电脑吃饭的人来说,眼睛是绝对不能出问题的,但是啊哎,好希望若要研究程序的话,能抛开肉体的限制就好了。存在于网络上的文化乐园也岌岌可危,我无能为力,我要争取机会去往乐园能深深扎根的地方)

版权声明: https://blog.csdn.net/su_cicada/article/details/79953309

UVA - 220 - Othello

最害怕这种下棋的题了,情况特别多,考差细节特别多,当时没做,现在翻过头来再看一下,顺便复习一下基础。 这道题要注意格式,输出统计黑白棋子数的时候,数要占两位。其他都是普通的思路,顺着题目要求即可。 ...
  • kun768
  • kun768
  • 2015-01-26 10:37:50
  • 1959

UVa 220 - Othello

一道黑白棋的模拟,难度上来说不算难,属于比较麻烦的……因为要八个方向去找去操作,没啥好说的,就是模拟。...
  • crazysillynerd
  • crazysillynerd
  • 2014-08-13 15:39:59
  • 1465

Uva220 Othello

可用Udebug上的测试数据测试下(不全) 1.输出格式注意 程序结束的结尾换行是否有多  2.输出黑白棋子数的时候数字%2d输出 3.边界值注意 4.打印所有合法点的时候两点之间有空格 最有一个点输...
  • h1120023921
  • h1120023921
  • 2016-08-04 15:34:12
  • 431

UVA - 220 Othello(黑白棋)

题目链接 说说 这种题做起来最难受了,思路上没什么难度,细节处理一大堆,一不小心就得wrong,这次还好,一气呵成,写好后稍加改动就过了。 这种题一般代码量是需要不少的,常常会有很多冗余的...
  • to_be_better
  • to_be_better
  • 2015-11-21 03:57:42
  • 1596

uva 220 Othello

未A,但是测试了好多数据,没有找出错误。#include #include #include using namespace std; using namespace std; char board[...
  • qq_33901573
  • qq_33901573
  • 2016-05-18 19:02:07
  • 198

习题4-3 黑白棋 UVa220

算法竞赛入门经典(第2版)第4章 函数和递归 习题4-3 黑白棋  UVa220 感悟。 1、阅读书中题目,从网站下载英文原题,重点在看输入输出数据与格式。 2、...
  • mrcrack
  • mrcrack
  • 2016-11-01 15:36:48
  • 968

小紫书 4-3 UVA 220 Othello

代码: #include #include #include #include #include #include #include using namespace std; char...
  • code12hour
  • code12hour
  • 2016-02-21 22:31:42
  • 220

POJ_MOOC_8459特殊密码锁

熬夜的充要条件是——debug 记代码曾犯过的低级错误: 当按下s[0]时,忘了同时反转s[1]...
  • qq_16603365
  • qq_16603365
  • 2017-07-11 02:03:33
  • 68

UVA - 220 Othello

题目: Othello is a game played by two people on an 8 x 8 board, using disks that are white on one...
  • qq_26083215
  • qq_26083215
  • 2017-05-03 20:01:43
  • 151

reversi-cli - 跟风做的一个黑白棋小游戏

最近几天听说有一些实训的小伙伴的项目是做一个黑白棋游戏,于是我也跟风去凑个热闹,权当练练手,锻炼一下写个小项目的能力。断断续续做了两天(因为还有比赛),只做好了基本功能,没有来得及学习 AI 方面的东...
  • dreamer_blue
  • dreamer_blue
  • 2016-07-14 17:42:58
  • 732
收藏助手
不良信息举报
您举报文章:uva 220 - Othello(黑白翻转棋)
举报原因:
原因补充:

(最多只允许输入30个字)