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