求助:有没有人看一下CE在哪里
  • 板块灌水区
  • 楼主Reply_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/13 14:06
  • 上次更新2023/11/3 10:07:46
查看原帖
求助:有没有人看一下CE在哪里
373530
Reply_楼主2023/7/13 14:06
#include <bits/stdc++.h>
#define R register
#define ll long long
#define F(i,a,b) for(int i = (a);i<=(b);i++)
using namespace std;
inline int read(){R int x=0,t=1;R char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*t;}
struct Node
{
	int a[4][4];
}m[1001],ans[1001];
map<Node,int>mp;
int minn;
inline bool check(int i)
{
	return (m[i].a[1][1]==0 && m[i].a[1][2]==1 &&m[i].a[1][3]==2 &&m[i].a[2][1]==3 &&m[i].a[2][2]==4 &&m[i].a[2][3]==5 &&m[i].a[3][1]==6 &&m[i].a[3][2]==7 && m[i].a[3][3]==8);
}
void dfs(int i)
{
	if(minn<=i) return; 
	m[i]=m[i-1];
	//456->645
	swap(m[i].a[2][1],m[i].a[2][2]);
	swap(m[i].a[2][2],m[i].a[2][3]);
	if(check(i) && minn>i){//是目标矩阵 
		minn=i;
		for(int j = 1;j<=i;j++) ans[j]=m[j];//存过程 
	}
	if(mp[m[i]]==0) mp[m[i]]=i;
	else
	{
		if(mp[m[i]]>i) {
			mp[m[i]]=i;		
			dfs(i+1);
		}
	}
	m[i]=m[i-1];
	/*
	123
	456
	789
	-----
	412
	753
	896
	*/
	m[i].a[1][1]=m[i-1].a[2][1],m[i].a[1][2]=m[i-1].a[1][1],m[i].a[1][3]=m[i-1].a[1][2];
	m[i].a[2][1]=m[i-1].a[3][1],m[i].a[2][3]=m[i-1].a[1][3];
	m[i].a[3][1]=m[i-1].a[3][2],m[i].a[3][2]=m[i-1].a[3][3],m[i].a[3][3]=m[i-1].a[2][3];
	if(check(i) && minn>i){//是目标矩阵 
		minn=i;
		for(int j = 1;j<=i;j++) ans[j]=m[j];
	}
	if(mp[m[i]]==0) mp[m[i]]=i;
	else
	{
		if(mp[m[i]]>i) {
			mp[m[i]]=i;		
			dfs(i+1);
		}
	}
	m[i]=m[i-1];
	return;
}
inline void solve()
{
	//m[0]为目标矩阵 
	m[0].a[1][1]=0,m[0].a[1][2]=1,m[0].a[1][3]=2;
	m[0].a[2][1]=3,m[0].a[2][2]=4,m[0].a[2][3]=5;
	m[0].a[3][1]=6,m[0].a[3][2]=7,m[0].a[3][3]=8;	
//	puts("UNSOLVABLE");
	for(int i = 1;i<=3;i++)
	{
		for(int j = 1;j<=3;j++)
		{
			cin >> m[1].a[i][j];
		}
	}
	dfs(2);
	cout << minn-1;
	return;
}
int main()
{
	solve();
	return 0;
}


2023/7/13 14:06
加载中...