【QED】井字棋

题目背景

井字棋,英文名叫Tic-Tac-Toe,是一种在 3 × 3 3 \times 3 3×3格子上进行的连珠游戏,和五子棋类似。游戏时,由分别代表O和X的两名玩家轮流在棋盘格子里留下棋子,已有棋子占据的格子不能再放入新的棋子。当任意三个同种棋子连成一条直线时,该玩家获得胜利。
在这里插入图片描述

题目描述

"ycccc319"最近在和"锕狗"在玩井字棋。

开学以来,他们已经进行了 998244353 998244353 998244353次对局,而这些对局中有十成甚至九成都是平局,他们对此感到十分地无聊。

为此,他们想要整些新活。看着手中的棋盘和棋子,他们陷入了沉思:他们想知道,用手中的O形棋子和X型棋子 9 9 9在棋盘上摆放并将其填满,在同种棋子之间并无差异而不同格子间均有差异的前提下,一共有多少种不同的方案?而这些方案分别又是什么样的呢?

请你帮他们解决这个问题。

输入格式

该题无输入,请按输出格式输出即可。

输出格式

你的程序共需输出 4 n + 1 4n+1 4n+1行,其中 n n n为本题答案,即将棋盘填满的方案种数。

1 1 1行一个整数 n n n,代表本题答案。接下来的 4 n 4n 4n行,你需要输出所有可能的方案。

以每 4 4 4行为一组。其中第 1 1 1行为空行,切勿输出任何字符,仅做分隔用;第 2 ∼ 4 2 \sim 4 24行每行输出 3 3 3个字符,共 9 9 9个字符,用以代表一种方案。其中,用大写英文字母"O"表示O形棋子,用大写英文字母"X"表示X型棋子。

方案之间无顺序要求,以任意顺序输出均可。

测试样例

(无输入)
(此处假设n=4,给出该情况下的输出示例以供参考,非正确答案)
4

OXO
XOX
OXO

OOO
OOO
OOO

XXX
XXX
XXX

OOO
OXX
OXX

思路

这是一个构造类的题目,因为本题中所有的空格都是不一样的,只有棋子是黑或者白的区别,此时每一个格子里都有两种可能:黑或者白,所以方案的数量一共有29个。这里给出一种求解的方案,把9个方格看做成9个数位,每一个位置可能是0或者是1,那就是一个二进制数对应一种方案,按顺序枚举每一个二进制的数然后转换即可。

核心代码

#include <bits/stdc++.h>
using namespace std;

void solve(int n)
{
    cout<<"\n";
    int tot=n;
    for(int j=0;j<3;j++){
        string str="";
        for(int k=0;k<3;k++){
            if(!(tot&1))str+="O";
            else str+="X";
            tot>>=1;
        }
        cout<<str<<"\n";
    }
}

int main()
{
    int t=1<<9;
    cout<<t<<"\n";
    while(t--)
    {
        solve(t);
    }
    return 0;
}
  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要AC的dly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值