BFS 0分,求调悬
查看原帖
BFS 0分,求调悬
648756
Shadow_Lord楼主2023/2/16 18:51
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
    long long s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=s*10+(ch-'0'),ch=getchar();
    return s*w;
}
int t,xx[10]={1,1,-1,-1,2,2,-2,-2},yy[10]={2,-2,2,-2,1,-1,1,-1},stx,sty,ans=0x3f3f3f3f;
char a[6][6],b[6][6];
map<int,bool>Map;
int vis(int xxx,int yyy)
{
	int h;
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=5;j++)
		{
			if(a[i][j]=='1')
			{
				h=h<<1+1;
			}
			if(a[i][j]=='0')
			{
				h=h<<1;
			}
		}
	}
	h=h*6+xxx;
	h=h*6+yyy;
	return h;
}
bool check()
{
	
	for(int i=1;i<=5;i++)
	{
		for(int j=1;j<=5;j++)
		{
			if(a[i][j]!=b[i][j])
			{
//				cout<<"||";
				return 0;
			}
//			cout<<a[i][j];
		}
//		cout<<"\n";
	}
//	cout<<"\n";
	return 1;
}
void bfs(int num,int x,int y)
{
	if(num>15)return ;
	else
	{
		if(x==3&&y==3)
		{
//			cout<<num<<"\n";
			if(check())ans=min(ans,num);
		}
		
	}
	int gf=vis(x,y);
	if(Map[gf])return ;
	Map[gf]=1;
	for(int i=0;i<8;i++)
	{
		int p1=x+xx[i],p2=y+yy[i];
		if(p1<1||p1>5||p2>5||p2<1)continue;
		a[x][y]=a[p1][p2];
		a[p1][p2]='*';
		bfs(num+1,p1,p2);
		a[p1][p2]=a[x][y];
		a[x][y]='*';
	}
}
 main()
{
	t=read();
	b[1][1]='1';b[1][2]='1';b[1][3]='1';b[1][4]='1';b[1][5]='1';
	b[2][1]='0';b[2][2]='1';b[2][3]='1';b[2][4]='1';b[2][5]='1';
	b[3][1]='0';b[3][2]='0';b[3][3]='*';b[3][4]='1';b[3][5]='1';
	b[4][1]='0';b[4][2]='0';b[4][3]='0';b[4][4]='0';b[4][5]='1';
	b[5][1]='0';b[5][2]='0';b[5][3]='0';b[5][4]='0';b[5][5]='0';
	while(t--)
	{
		ans=0x3f3f3f3f;
		for(int i=1;i<=5;i++)
		{
			for(int j=1;j<=5;j++)
			{
				cin>>a[i][j];
				if(a[i][j]=='*')stx=i,sty=j;
			}
		}
		bfs(0,stx,sty);
		if(ans==0x3f3f3f3f)cout<<"-1\n";
		else cout<<ans<<"\n";
	}
	return 0;
}
2023/2/16 18:51
加载中...