题目链接:洛谷
分析
一开始调了好久aaa
显然是DFS,看看怎么处理。首先这个是以三个字符作为一个字符,最边上一列肯定是‘#’,所以后面我们全部都*3+1就可以。
因为是3*3棋盘,所以可以用一个 3 9 3^9 39的数存下棋盘(思想就是3进制状压),用数组存下每一种棋盘状态去搜索,如果搜过就跳出。
用1,2分别代表M,O,去填棋盘,然后每次都判断是否胜利,用win数组记录胜利的棋盘,以防下次重复统计。
判断胜利:棋盘的胜利状态只有16种。把状态倒出来之后,判断就好。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,sx,sy,ans;
char a[30][100],pan[5][5];
int pw[10];
int dx[5]={
0,1,0,-1,0};
int dy[5]={
0,0,1,0,-1};
int v[30][30][20001],win[20001];//3^9=19683
bool checkpan(int x)
{
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
if(x%3==0) pan[i][j]=' ';
else if(x%3==1) pan[i][j]='M';
else if(x%3==2) pan[i][j]='O';
x/=3;
}
}
if(pan[1][1