bfs+康托展开,为什么除了最后一个点全RE
查看原帖
bfs+康托展开,为什么除了最后一个点全RE
305854
Drind楼主2021/5/24 21:08

RT

代码:

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

struct bsm
{
	int a[4][4];
}start,endg,q[1000001];

int power[20]={1,1,2,6,24,120,720,5040,40320,362880,3628800};
int vis[1000001]={0};
int step[1000001];
int endd;
int sta[10]={0,2,3,4,9,1,5,8,7,6};
int x[1000001];
int y[1000001];

int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};

int Cuntor(bsm x)
{
	int cnt=0,t[10],s;
	for(int i=1;i<=3;i++)
	for(int j=1;j<=3;j++)
		t[i*3-3+j]=x.a[i][j];
	for(int i=1;i<=9;i++)
	{
		s=0;
		for(int j=i+1;j<=9;j++)
			if(t[j]<t[i])
				s++;
		cnt+=power[9-i]*s;
	}
	return cnt;
}

bsm Change(int dir,int num,int kx,int ky)
{
	bsm t;
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			t.a[i][j]=q[num].a[i][j];
		}
	}
	if(dir==1)
	{
		swap(t.a[kx][ky],t.a[kx][ky+1]);
	}
	if(dir==2)
	{
		swap(t.a[kx][ky],t.a[kx][ky-1]);
	}
	if(dir==3)
	{
		swap(t.a[kx][ky],t.a[kx+1][ky]);
	}
	if(dir==4)
	{
		swap(t.a[kx][ky],t.a[kx-1][ky]);
	}
	return t;
}

void bfs()
{
	int head=1;
	int tail=1;
	bsm t;
	x[1]=y[1]=2;
	int tt;
	q[1]=start;
	step[1]=0;
	while(head<=tail)
	{
		for(int i=1;i<=4;i++)
		{
			tail++; 
			t=Change(i,head,x[head],y[head]);
			x[tail]=x[head]+dx[i];
			y[tail]=y[head]+dy[i];
			if(x[tail]<=0||y[tail]<=0||x[tail]>=4||y[tail]>=4)
			{	
				tail--; 
				continue;
			}
			//t=Change(i,head,x[tail],y[tail]);
			tt=Cuntor(t);
			if(vis[tt]==0)
			{
				q[tail]=t;
				step[tail]=step[head]+1;
				vis[tt]=1;
				//cout<<tt<<endl;
				//cout<<t.a[1][1]<<" "<<t.a[1][2]<<" "<<t.a[1][3]<<endl<<t.a[2][1]<<" "<<t.a[2][2]<<" "<<t.a[2][3]<<endl<<t.a[3][1]<<" "<<t.a[3][2]<<" "<<t.a[3][3]<<endl<<endl;
				if(tt==endd)
				{
					cout<<step[tail];
					return;
				}
			}
		}
		head++;
	}
}

int main()
{
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			start.a[i][j]=sta[i*3-3+j];
		}
	}
	int startt=Cuntor(start);
	//cout<<startt<<endl<<endl;
	vis[startt]=1;
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			char c;
			cin>>c; 
			endg.a[i][j]=char(c-'0'+1);
		}
	}
	endd=Cuntor(endg);
	//cout<<endd;
	//cout<<endl<<endl;
	if(endd==startt)
	{
		cout<<0;
		return 0;
	}
	bfs();
	//cout<<"NO.."<<endl; 
}
//283                283
//104				 104
//765				 765

注释的是调试部分

2021/5/24 21:08
加载中...