目录
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 测试样例
- 思路
- 核心代码
题目背景
井字棋,英文名叫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 2∼4行每行输出 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;
}