WA求助
查看原帖
WA求助
751073
wuxiyi楼主2023/3/7 21:06
#include<cstdio>
#include<algorithm>
using namespace std;
/*
      00    01  
      02    03
04 05 06 07 08 09 10
      11    12
13 14 15 16 17 18 19
      20    21
      22    23
*/
int line[8][8]={
	{ 0, 2, 6,11,15,20,22},//A 0
	{ 1, 3, 8,12,17,21,23},//B 1
	{10, 9, 8, 7, 6, 5, 4},//C 2
	{19,18,17,16,15,14,13},//D 3
	{23,21,17,12, 8, 3, 1},//E 4
	{22,20,15,11, 6, 2, 0},//F 5
	{13,14,15,16,17,18,19},//G 6
	{ 4, 5, 6, 7, 8, 9,10} //H 7
};
int rev[8]={ 5, 4, 7, 6, 1, 0, 3, 2};
int center[8]={ 6, 7, 8, 11, 12, 15, 16, 17};
int a[24];
char ans[1009];
int diff(int target)
{
	int ans1=0;
	for (int i=0;i<8;i++)
	{
		if (a[center[i]]!=target)
		{
			ans1++;
		}
	}
	return ans1;
}
int f()
{
	return min(diff(1),min(diff(2),diff(3)));
}
void move(int tmp){
	int tmp1=a[line[tmp][0]];
	for (int i=0;i<=5;i++)
	{
		a[line[tmp][i]]=a[line[tmp][i+1]];
	}
	a[line[tmp][6]]=tmp1;
}
bool dfs(int d,int maxd)
{
	if (d+f()>maxd)	return false;
	if (f()==0){
		ans[d]='\0';
		return true;
	}
	for (int i=0;i<8;i++)
	{
		move(i);
		ans[d]='A'+i;
		if (dfs(d+1,maxd))	return true;
		move(rev[i]);
	}
}
int main()
{
	while (scanf("%d",&a[0])&&a[0])
	{
		for (int i=1;i<24;i++){
			scanf("%d",&a[i]);
			if (!a[i])	return 0;
		}
		if (!f())
		{
			printf("No moves needed\n");
			printf("%d\n",a[6]);
			continue;
		}
		for (int i=1;;i++)
		{
			if (dfs(0,i))	break;
		}
		printf("%s\n",ans);
		printf("%d\n",a[6]);
	}
	return 0;
}
2023/3/7 21:06
加载中...