UVA1343TheRotationGame

6 篇文章 0 订阅
4 篇文章 0 订阅
//UVA1343TheRotationGame
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 30;
int maxd;
int a[MAXN];
char ans[100];
int line[8][7] = {
    {22, 20, 15, 11, 6, 2, 0 },
    {23, 21, 17, 12, 8, 3, 1 },
    {4,   5,  6,  7, 8, 9, 10},
	{13, 14, 15, 16,17,18, 19},
};
int rev[8] = {5, 4, 7, 6, 1, 0, 3, 2};
int centre[8] = {6, 7, 8, 12, 17, 16, 15, 11};
bool Is_final() {
	int tmp = a[centre[0]];
	for(int i = 0; i < 8; i++) if(a[centre[i]] != tmp) return false;
	return true;  
}
int Diff(int target) {
	int cnt = 0;
	for(int i = 0; i < 8; i++) if(a[centre[i]] != target) cnt++;
	return cnt;
}
int h() {
	return min(Diff(1), min(Diff(2), Diff(3)));
}
void Move(int b) {
	int tmp = a[line[b][6]];
	for(int i = 5; i >= 0; i--) a[line[b][i + 1]] = a[line[b][i]];
	a[line[b][0]] = tmp;
} 
bool dfs(int d) {
	if(Is_final()) {
		//printf("ans[d]%c, d = %d\n", ans[d], d);
	    ans[d] = 0;
	    return true;
	}
	if(d + h() > maxd) return false;
	for(int i = 0; i < 8; i++) {
		ans[d] = i + 'A';
		//printf("**%c, d = %d\n",  ans[d], d);
		int olda[MAXN];
	    //memcpy(olda, a, sizeof(a));
		Move(i);
		if(dfs(d + 1)) return true;
		Move(rev[i]);//当搜索失败时消去影响
		//memcpy(a, olda, sizeof(a));
	}
	return false;
}
int main() {
	for(int i = 4; i <= 7; i++) {
		for(int j = 0; j < 7; j++) {
			line[i][j] = line[rev[i]][6 - j];
		}
	}
	while(scanf("%d", &a[0]) == 1 && a[0]) {
		for(int i = 1; i < 24; i++) scanf("%d", &a[i]);
		if(Is_final()) printf("No moves needed\n%d\n", a[centre[0]]);
		else {
		    for(maxd = 1; ; maxd++) {
			    if(dfs(0)) { printf("%s\n%d\n", ans, a[centre[0]]);/* for(int i = 0; i < 24; i++) printf("%2d", a[i]); printf("\n");*/ break; }
		    }
	    }
	}
	return 0;
}
/*

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值