by---cxlove
起始狀態和目標狀態都已確定,而且狀態比較多,可以雙向bfs搞定,不過需要記錄路徑,**不好寫,而且需要時間多。
從amb的博文裡學到了預處理,由於是8種顏色,而且可以確定,就可以通過置換,把起始狀態轉換成12345678,目標狀態同時也置換。
對於起點12345678,進行bfs,到所有狀態的路徑。對於每一種詢問直接查詢即可。
hash用的是康托展開
dbl,orz
#include#include#include#include#include#include#include#include#include#include#define inf 1<<30
#define ll long long
#define maxn 1<<24
using namespace std;
struct nodes,u,v;
int fac[8]=;
int pre[40321];
char ope[40321];
int get_hash(int *tmp)
return ret;
}void change_a(int *tmp)
void change_b(int *tmp)
void change_c(int *tmp)
void bfs()
}else if(i==1)
}else
}} }
}int main();
memcpy(s.a,t,8*sizeof(int));
s.val=get_hash(s.a);
bfs();
char s1[10],s2[10];
while(scanf("%s%s",s1,s2)!=eof)
for(int i=cnt-1;i>=0;i--)
putchar(ans[i]);
putchar('\n');
} return 0;
}
HDU1430 魔板 康托展開
problem description 在魔方風靡全球之後不久,rubik先生發明了它的簡化版 魔板。魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,可用數字1 8分別表示。任一時刻魔板的狀態可用方塊的顏色序列表示 從魔板的左上角開始,按順時針方向依次寫下各方塊的顏色代號,所得到的數字序列即可表...
hdu 1430 魔板 康拓展開 對映優化
給定三種操作,將排列a轉化為排列b,求最少步驟。這種題目可以只跑一次bfs,比如只跑 12345678 那麼如果遇到 23456781 某個字串呢?因為每乙個數字都是等價的,我們可以把2對映為1,3對映成2,以此類推。這樣就可以用 12345678 跑出來的操作序列了。include include...
HDU 1430(康拓展開hash)
在魔方風靡全球之後不久,rubik先生發明了它的簡化版 魔板。魔板由8個同樣大小的方塊組成,每個方塊顏色均不相同,可用數字1 8分別表示。任一時刻魔板的狀態可用方塊的顏色序列表示 從魔板的左上角開始,按順時針方向依次寫下各方塊的顏色代號,所得到的數字序列即可表示此時魔板的狀態。例如,序列 1,2,3...