标签:psi ref blocks sizeof each color turn iss symbols
Time Limit: 15000MS | Memory Limit: 150000K | |
Total Submissions: 6396 | Accepted: 2153 |
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
题目链接:POJ 2286
第一道IDA*题目,由于用的是递归的写法,代码量实际上不会很大,只要在dfs入口处做好各种判断就可以了 ,能用IDA*的前提至少答案要存在,如果不存在的话搜索深度会无限加深就没有意义了,然后每一次都用估价函数剪枝即可,再加一个防止来回的剪枝速度可以快一倍
大致伪代码如下:
void dfs(state, dep)
{
计算此时状态下的估价函数值h(state)
if(h(state)==0)
已到终点,返回true
else if(h(state)+dep>Maxdep)
在规定的Maxdep内一定走不到终点,返回false
else
{
for....
{
得到新状态n_state
if(dfs(n_state,dep))
return 1;
}
}
return 0;
}
代码:
#include <stdio.h> #include <iostream> #include <algorithm> #include <cstdlib> #include <sstream> #include <numeric> #include <cstring> #include <bitset> #include <string> #include <deque> #include <stack> #include <cmath> #include <queue> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define LC(x) (x<<1) #define RC(x) ((x<<1)+1) #define MID(x,y) ((x+y)>>1) #define CLR(arr,val) memset(arr,val,sizeof(arr)) #define FAST_IO ios::sync_with_stdio(false);cin.tie(0); typedef pair<int, int> pii; typedef long long LL; const double PI = acos(-1.0); const int N = 25; int arr[N], cnt[4]; int Max_dep, Num; char ans[1000]; int top,Back[8]={5,4,7,6,1,0,3,2};//Back数组,减掉正拉动后又马上反向拉动的无意义搜索 int pos[8][7] = { {1, 3, 7, 12, 16, 21, 23}, //A0 {2, 4, 9, 13, 18, 22, 24}, //B1 {11, 10, 9, 8, 7, 6, 5}, //C2 {20, 19, 18, 17, 16, 15, 14}, //D3 {24, 22, 18, 13, 9, 4, 2},//E4 {23, 21, 16, 12, 7, 3, 1},//F5 {14, 15, 16, 17, 18, 19, 20},//G6 {5, 6, 7, 8, 9, 10, 11},//H7 }; int Need(int cur[]) { int i; cnt[1] = cnt[2] = cnt[3] = 0; for (i = 7; i <= 9; ++i) ++cnt[cur[i]]; for (i = 12; i <= 13; ++i) ++cnt[cur[i]]; for (i = 16; i <= 18; ++i) ++cnt[cur[i]]; int Need_1 = 8 - cnt[1], Need_2 = 8 - cnt[2], Need_3 = 8 - cnt[3]; int Min_Need = min(Need_1, min(Need_2, Need_3)); return Min_Need; } int IDA_star(int dep, int Arr[],int pre) { int Need_cur = Need(Arr); if (Need_cur == 0) { Num = Arr[7]; return 1; } if (Need_cur + dep > Max_dep) return 0; int Temp_arr[N]; for (int Opsid = 0; Opsid < 8; ++Opsid) { if(Opsid==pre) continue; ans[top++] = ‘A‘ + Opsid; for (int i = 1; i <= 24; ++i) Temp_arr[i] = Arr[i]; for (int i = 0; i < 7; ++i) Temp_arr[pos[Opsid][i]] = Arr[pos[Opsid][(i + 1) % 7]]; if (IDA_star(dep + 1, Temp_arr, Back[Opsid])) return 1; else --top; } return 0; } int main(void) { while (~scanf("%d", &arr[1]) && arr[1]) { for (int i = 2; i <= 24; ++i) scanf("%d", &arr[i]); if (Need(arr) == 0) { puts("No moves needed"); printf("%d\n", arr[7]); } else { top = 0; Max_dep = 1; Num = -1; while (!IDA_star(0, arr, -1)) ++Max_dep; ans[top] = ‘\0‘; puts(ans); printf("%d\n", Num); } } return 0; }
POJ 2286 The Rotation Game(IDA*)
标签:psi ref blocks sizeof each color turn iss symbols
原文地址:http://www.cnblogs.com/Blackops/p/7008622.html