
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
AC 2 DDHH 2
这道题跟HDU2234有点像,用IDA*来做的话,最主要的就是估测函数了,这里进行估测的就是中间环中海油几个不匹配的,这里的匹配,就是找出环内最多的数字,然后看还有多少个不相等的位置
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int map[10][10];
int hash[8] = {3,5,3,5,5,3,5,3};
char ans[100];
int step;
int get_h()
{
int i,num[10]= {0};
for(i=3; i<=5; i++)
{
num[map[3][i]]++;
num[map[5][i]]++;
}
num[map[4][3]]++;
num[map[4][5]]++;
return max(num[1],max(num[2],num[3]));//找出最大的
}
void turn_col(int k,int flag)
{
int i,tem;
if(flag)
{
tem = map[1][k];
for(i = 2; i<=7; i++)
map[i-1][k] = map[i][k];
map[7][k] = tem;
}
else
{
tem = map[7][k];
for(i = 7; i>=2; i--)
map[i][k] = map[i-1][k];
map[1][k] = tem;
}
}
void turn_row(int k,int flag)
{
int i,tem;
if(!flag)
{
tem = map[k][1];
for(i = 2; i<=7; i++)
map[k][i-1] = map[k][i];
map[k][7] = tem;
}
else
{
tem = map[k][7];
for(i = 7; i>=2; i--)
map[k][i] = map[k][i-1];
map[k][1] = tem;
}
}
int dfs(int cnt)
{
int tem = get_h(),i;
if(tem==8 && cnt == step)
return 1;
if(cnt+(8-tem)>step)
return 0;
char c;
for(i = 0; i<8; i++)
{
c = i+‘A‘;
ans[cnt] = c;
if(c == ‘A‘ || c == ‘B‘)
{
turn_col(hash[i],1);
if(dfs(cnt+1)) return 1;
turn_col(hash[i],0);
}
else if(c == ‘E‘ || c == ‘F‘)
{
turn_col(hash[i],0);
if(dfs(cnt+1)) return 1;
turn_col(hash[i],1);
}
else if(c == ‘C‘ || c == ‘D‘)
{
turn_row(hash[i],1);
if(dfs(cnt+1)) return 1;
turn_row(hash[i],0);
}
else if(c == ‘G‘ || c == ‘H‘)
{
turn_row(hash[i],0);
if(dfs(cnt+1)) return 1;
turn_row(hash[i],1);
}
}
return 0;
}
int main()
{
int a,i,j,k;
while(~scanf("%d",&a),a)
{
map[1][3] = a;
scanf("%d",&a);
map[1][5] = a;
for(i = 2; i<=7; i++)
{
if(i == 3 || i == 5)
{
for(j = 1; j<=7; j++)
scanf("%d",&map[i][j]);
}
else
scanf("%d%d",&map[i][3],&map[i][5]);
}
if(get_h() == 8)
{
printf("No moves needed\n%d\n",map[3][3]);//已经匹配就直接输出即可
continue;
}
step = 1;
while(1)
{
if(dfs(0))
break;
step++;
}
ans[step] = ‘\0‘;
printf("%s\n%d\n",ans,map[3][3]);
}
return 0;
}
HDU1667:The Rotation Game(IDA星),布布扣,bubuko.com
HDU1667:The Rotation Game(IDA星)
原文:http://blog.csdn.net/libin56842/article/details/23758829