2021.8.14提高B组模拟6T4 + P7555 [USACO21OPEN] Maze Tac Toe (dfs)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.8.14提高B组模拟6T4 + P7555 [USACO21OPEN] Maze Tac Toe (dfs)相关的知识,希望对你有一定的参考价值。

Maze Tac Toe

题目传送门



解题思路

暴力dfs

存储编号

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
	int num,x,y;
}map[30][30];
int n,ans,px,py,b[20005],f[5][5],c[30][30][20005];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
string s;
int getsum()//求编号
{
	int sum=0;
	for(int i=1;i<=3;i++)
		for(int j=1;j<=3;j++)
			sum=sum*3+f[i][j];
	return sum;
}
bool pd()//判断是否可行
{
	for(int i=1;i<=3;i++)
	{
		if(f[i][1]==2&&f[i][2]==1&&f[i][3]==1)return true;
		if(f[i][1]==1&&f[i][2]==1&&f[i][3]==2)return true;
		if(f[1][i]==2&&f[2][i]==1&&f[3][i]==1)return true;
		if(f[1][i]==1&&f[2][i]==1&&f[3][i]==2)return true;
	}
	if(f[1][1]==2&&f[2][2]==1&&f[3][3]==1)return true;
	if(f[1][1]==1&&f[2][2]==1&&f[3][3]==2)return true;
	if(f[1][3]==2&&f[2][2]==1&&f[3][1]==1)return true;
	if(f[1][3]==1&&f[2][2]==1&&f[3][1]==2)return true;
	return false;
}
bool check(int x,int y)//判断
{
	if(x>=1&&x<=n&&y>=1&&y<=n)return true;
	return false;
}
void dfs(int x,int y)
{
	int z=getsum();//求z
	if(c[x][y][z])return;//记忆化
	c[x][y][z]=1;
	if(!b[z])
	{
		if(pd())
		{
			b[z]=1;
			ans++;
			return;
		}
	}
	else return;
	for(int i=0;i<4;i++)
	{
		int xx=dx[i]+x,yy=dy[i]+y;
		if(check(xx,yy))
			if(map[xx][yy].num!=0)
			{
				int ox=map[xx][yy].x,oy=map[xx][yy].y;
				int last=f[ox][oy];//存储
				if(map[xx][yy].num!=1)
					if(!f[ox][oy])f[ox][oy]=map[xx][yy].num-1;
				dfs(xx,yy);//dfs
				f[ox][oy]=last;
			}
	}
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)//将图缩小
	{
		cin>>s;
		for(int j=0;j<3*n;j+=3)
			if(s[j]!='#')
			{
				if(s[j]=='O')map[i][j/3+1]=(node){2,s[j+1]-48,s[j+2]-48};
				else 
				{
					if(s[j]=='M')map[i][j/3+1]=(node){3,s[j+1]-48,s[j+2]-48};
					else 
					{
						if(s[j]=='B')px=i,py=j/3+1,map[i][j/3+1].num=1;
						else map[i][j/3+1].num=1;
					}
				}
			}
	}
	dfs(px,py);
	printf("%d",ans);
	return 0;
}

谢谢

以上是关于2021.8.14提高B组模拟6T4 + P7555 [USACO21OPEN] Maze Tac Toe (dfs)的主要内容,如果未能解决你的问题,请参考以下文章

2021.8.14提高B组模拟6T2 + P7557 [USACO21OPEN] Acowdemia (二分)

2021.8.14提高B组模拟6T2 + P7557 [USACO21OPEN] Acowdemia (二分)

2021.8.14提高B组模拟6T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)

2021.8.14提高B组模拟6T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)

2017.12.09NOIP提高组模拟赛A组

2017.07.16【NOIP提高组】模拟赛B组 卫星照片 题解