龙神宝物的博弈:小申能否获胜?

小申和小广历经千辛万苦终于找到了传说中的龙神殿。大殿里面有一个 3*3 的棋盘(9 个格子),起初每个格子均没有放置棋子。

现在小申得到了一盒黑棋,小广得到了一盒白棋。两人轮流行动,每次可以将一个棋子放入棋盘的格子内。

若某个人放置一个棋子后,该棋子与另外两个棋子(不论是谁放置的都可以)达成三子连线(即三个棋子连成一条线,水平、垂直、主副对角线均可),则该人获胜。获胜的人也将得到龙神的宝物。

小申总是先手。若小申将第一个棋子放在(x,y)的格子内后,小申是否会获胜。(小申和小广每次放棋子都是采取最优的策略)

输入格式

第一行输入两个正整数 x,y,1 ≤ x,y ≤ 3,表示小申第一个棋子放置的格子坐标。

输出格式

若小申将第一个棋子放置于格子(x,y)后,最终会获胜,则输出'hhhh ye'(不含引号),否则输出'oh no'(不含引号)

样例 #1

样例输入 #1

2 2

样例输出 #1

hhhh ye

c++ code内容:

#include<bits/stdc++.h>
using namespace std;
int a[4][4];
int main()
{
    int x,y;
    cin>>x>>y;
    a[x][y]=1;//小申先下
    for(int i=1;i<=9;i++)
    {
        int x1,y1;
        if(a[1][1]==a[1][2]&&a[1][2]==a[1][3]&&a[1][3]||a[2][1]==a[2][2]&&a[2][2]==a[2][3]&&a[2][3]||a[3][1]==a[3][2]&&a[3][2]==a[3][3]&&a[3][3]||a[1][1]==a[2][1]&&a[2][1]==a[3][1]&&a[3][1]||a[1][2]==a[2][2]&&a[2][2]==a[3][2]&&a[3][2]||a[1][3]==a[2][3]&&a[2][3]==a[3][3]&&a[3][3]||a[1][1]==a[2][2]&&a[2][2]==a[3][3]&&a[3][3]||a[1][3]==a[2][2]&&a[2][2]==a[3][1]&&a[3][1])//判断是否有三个相同的
        {
            cout<<'oh  no'<<endl;
            return 0;
        }
        if(i%2==0)//小广下
        {
            int sum=0;
            for(int x2=1;x2<=3;x2++)
            {
                for(int y2=1;y2<=3;y2++)
                {
                    if(a[x2][y2]==0)//判断是否有空位
                    {
                        a[x2][y2]=2;//小广下
                        if(a[1][1]==a[1][2]&&a[1][2]==a[1][3]&&a[1][3]||a[2][1]==a[2][2]&&a[2][2]==a[2][3]&&a[2][3]||a[3][1]==a[3][2]&&a[3][2]==a[3][3]&&a[3][3]||a[1][1]==a[2][1]&&a[2][1]==a[3][1]&&a[3][1]||a[1][2]==a[2][2]&&a[2][2]==a[3][2]&&a[3][2]||a[1][3]==a[2][3]&&a[2][3]==a[3][3]&&a[3][3]||a[1][1]==a[2][2]&&a[2][2]==a[3][3]&&a[3][3]||a[1][3]==a[2][2]&&a[2][2]==a[3][1]&&a[3][1])
                        {
                            a[x2][y2]=0;//如果下在该位置以后会赢,就不下
                            sum=1;
                            break;
                        }
                        a[x2][y2]=0;//小广下完后要记得吧棋子拿走
                    }
                }
                if(sum==1)
                {
                    break;
                }
            }
            if(sum==0)//如果没有下在可以赢的位置,就随便下
            {
                for(int x2=1;x2<=3;x2++)
                {
                    for(int y2=1;y2<=3;y2++)
                    {
                        if(a[x2][y2]==0)
                        {
                            a[x2][y2]=2;
                            break;
                        }
                    }
                }
            }
        }
        else//小申下
        {
            int sum=0;
            for(int x2=1;x2<=3;x2++)
            {
                for(int y2=1;y2<=3;y2++)
                {
                    if(a[x2][y2]==0)
                    {
                        a[x2][y2]=1;
                        if(a[1][1]==a[1][2]&&a[1][2]==a[1][3]&&a[1][3]||a[2][1]==a[2][2]&&a[2][2]==a[2][3]&&a[2][3]||a[3][1]==a[3][2]&&a[3][2]==a[3][3]&&a[3][3]||a[1][1]==a[2][1]&&a[2][1]==a[3][1]&&a[3][1]||a[1][2]==a[2][2]&&a[2][2]==a[3][2]&&a[3][2]||a[1][3]==a[2][3]&&a[2][3]==a[3][3]&&a[3][3]||a[1][1]==a[2][2]&&a[2][2]==a[3][3]&&a[3][3]||a[1][3]==a[2][2]&&a[2][2]==a[3][1]&&a[3][1])
                        {
                            a[x2][y2]=0;
                            sum=1;
                            break;
                        }
                        a[x2][y2]=0;
                    }
                }
                if(sum==1)
                {
                    break;
                }
            }
            if(sum==0)
            {
                for(int x2=1;x2<=3;x2++)
                {
                    for(int y2=1;y2<=3;y2++)
                    {
                        if(a[x2][y2]==0)
                        {
                            a[x2][y2]=1;
                            break;
                        }
                    }
                }
            }
        }
    }
    cout<<'hhhh ye'<<endl;//如果没有人赢就小申赢
    return 0;
}
龙神宝物的博弈:3x3棋盘游戏,小申能否获胜?

原文地址: https://www.cveoy.top/t/topic/n4ar 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录