第一次写IDA*。。。。
| Time Limit: 15000MS | Memory Limit: 150000K | |
| Total Submissions: 4915 | Accepted: 1635 |
Description

Input
Output
Sample Input
1 1 1 1 3 2 3 2 3 1 3 2 2 3 1 2 2 2 3 1 2 1 3 3 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 0
Sample Output
AC 2 DDHH 2
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int tu[25],deep;
void change(int& a1,int& a2,int& a3,int& a4,int& a5,int& a6,int& a7)
{
int temp=a1;
a1=a2;a2=a3;a3=a4;a4=a5;a5=a6;a6=a7;a7=temp;
}
int count(int tu[])
{
int a[4]={0,0,0,0};
a[tu[6]]++;a[tu[7]]++;a[tu[8]]++;
a[tu[11]]++; a[tu[12]]++;
a[tu[15]]++; a[tu[16]]++; a[tu[17]]++;
return max(a[1],max(a[2],a[3]));
}
int OK(int tu[],int& ak)
{
int temp=tu[6];
ak=temp;
if(temp!=tu[7]||temp!=tu[8]||temp!=tu[11]||temp!=tu[12]
||temp!=tu[15]||temp!=tu[16]||temp!=tu[17]) return 0;
return 1;
}
void CHANGE_A(int tu[])
{
change(tu[0],tu[2],tu[6],tu[11],tu[15],tu[20],tu[22]);
}
void CHANGE_F(int tu[])
{
change(tu[22],tu[20],tu[15],tu[11],tu[6],tu[2],tu[0]);
}
void CHANGE_B(int tu[])
{
change(tu[1],tu[3],tu[8],tu[12],tu[17],tu[21],tu[23]);
}
void CHANGE_E(int tu[])
{
change(tu[23],tu[21],tu[17],tu[12],tu[8],tu[3],tu[1]);
}
void CHANGE_C(int tu[])
{
change(tu[10],tu[9],tu[8],tu[7],tu[6],tu[5],tu[4]);
}
void CHANGE_H(int tu[])
{
change(tu[4],tu[5],tu[6],tu[7],tu[8],tu[9],tu[10]);
}
void CHANGE_D(int tu[])
{
change(tu[19],tu[18],tu[17],tu[16],tu[15],tu[14],tu[13]);
}
void CHANGE_G(int tu[])
{
change(tu[13],tu[14],tu[15],tu[16],tu[17],tu[18],tu[19]);
}
char OUT[1100];
int dfs(int pre,int now,int *tu)
{
if(now>deep) return 0;
if(deep-now<8-count(tu)) return 0;
int ak=0;
int tr[25];
for(int i=0;i<8;i++)
{
if((i==0&&pre==5)||(pre==0&&i==5)) continue;
if((i==1&&pre==4)||(pre==1&&i==4)) continue;
if((i==2&&pre==7)||(pre==2&&i==7)) continue;
if((i==3&&pre==6)||(pre==3&&i==6)) continue;
for(int j=0;j<25;j++) tr[j]=tu[j];
if(i==0)
{
CHANGE_A(tr); OUT[now]=‘A‘;
}
else if(i==1)
{
CHANGE_B(tr); OUT[now]=‘B‘;
}
else if(i==2)
{
CHANGE_C(tr); OUT[now]=‘C‘;
}
else if(i==3)
{
CHANGE_D(tr); OUT[now]=‘D‘;
}
else if(i==4)
{
CHANGE_E(tr); OUT[now]=‘E‘;
}
else if(i==5)
{
CHANGE_F(tr); OUT[now]=‘F‘;
}
else if(i==6)
{
CHANGE_G(tr); OUT[now]=‘G‘;
}
else if(i==7)
{
CHANGE_H(tr); OUT[now]=‘H‘;
}
if(OK(tr,ak))
{
printf("%s\n%d\n",OUT,ak);
return 1;
}
if(dfs(i,now+1,tr)) return 1;
}
return 0;
}
int main()
{
while(scanf("%d",tu)!=EOF&&tu[0])
{
for(int i=1;i<24;i++) scanf("%d",tu+i);
deep=1;
int ak=0;
if(OK(tu,ak))
{
puts("No moves needed");
printf("%d\n",ak);
continue;
}
memset(OUT,0,sizeof(OUT));
while(true)
{
if(!dfs(-1,0,tu)) deep++;
else break;
}
}
return 0;
}
原文:http://blog.csdn.net/u012797220/article/details/19404027