求助代码哪里错了!
  • 板块学术版
  • 楼主FarmarJohn
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/12/23 09:44
  • 上次更新2023/12/23 11:57:21
查看原帖
求助代码哪里错了!
750365
FarmarJohn楼主2023/12/23 09:44

#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
struct position
{
	int a,b,c,d,e,f,g,h,i;
	long long step;
	inline void operator = (position x)
	{
		a=x.a,b=x.b,c=x.c,d=x.d,e=x.e,f=x.f,g=x.g,h=x.h,i=x.i;
	}
}f;
bool vis[400000];
queue<position>q;
int ans;
inline void swap(int &a,int &b)
{
	a=a+b;
	b=a-b;
	a=a-b;
}
inline int jc(int n)
{
	int num=1;
	for(int i=2;i<=n;i++)num*=i;
	return num;
}
inline void move1(position &f)
{
    int tmp=f.a;
    f.a=f.d,f.d=f.g,f.g=f.h;
    f.h=f.i,f.i=f.f,f.f=f.c,f.c=f.b,f.b=tmp;
}
inline void move2(position &f)
{
    int tmp=f.b;
    f.b=f.c,f.c=f.f,f.f=f.i;
    f.i=f.h,f.h=f.g,f.g=f.d,f.d=f.a,f.a=tmp;
}
inline void move3(position &f)
{
    swap(f.a,f.d),swap(f.d,f.g);
    swap(f.b,f.e),swap(f.e,f.h);
    swap(f.c,f.f),swap(f.f,f.i);
}
inline int ktzk(position f)
{
	int a[15],num=0;
	bool v[15];
	for(int i=0;i<=10;i++)a[i]=v[i]=0;
	a[0]=f.a,a[1]=f.b,a[2]=f.c,a[3]=f.d,a[4]=f.e,a[5]=f.f,a[6]=f.g,a[7]=f.h,a[8]=f.i;	
	for(int j=0;j<9;++j)
	{
		int x=a[j];
		int s=0;
		for(int i=0;i<x;i++)if(v[i]==0)s++;
		v[x]=1;
		num+=s*jc(9-j-1);
	}
	return num;
}
int main()
{
//	freopen("1000_1.in","r",stdin);
//	freopen("1000_1.out","w",stdout);
	scanf("%1d%1d%1d%1d%1d%1d%1d%1d%1d",&f.a,&f.b,&f.c,&f.d,&f.e,&f.f,&f.g,&f.h,&f.i);
	f.step=0;
	q.push(f);
	ans=46234;
	while(!q.empty())
	{
		f=q.front();
		q.pop();
		int x=ktzk(f);
		if(x==ans)
		{
			printf("%lld\n",f.step);
			return 0;
		}
		if(vis[x]==1)continue;
		vis[x]=1;
		f.step++;
		position s=f;
		move1(s);
		if(!vis[ktzk(s)])vis[ktzk(s)]=1,q.push(s);
		s=f;
		move2(s);
		if(!vis[ktzk(s)])vis[ktzk(s)]=1,q.push(s);
		s=f;
		move3(s);
		if(!vis[ktzk(s)])vis[ktzk(s)]=1,q.push(s);
	}
	printf("No answer");
	return 0;
}
2023/12/23 09:44
加载中...