/*
Author:yew1eb Current Time: 2014.2.19
hdu1043 Eight
因为状态总数不多,只有不到40万种(9!),因此可以从目标节点开始,
进行一遍彻底的广搜,找出全部有解状态到目标节点的路径。
状态判重:
cantor展开
注意有多解!!Special Judge
*/
#include <cstdio>
#include <cstring>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN = 400000 ;
const int n = 9 ;
struct node {
int s[ 9 ] ;
int loc;
int hf;
string path;
} st;
int fac[ 9 ] = { 1 ,1 ,2 ,6 ,24 ,120 ,720 ,5040 ,40320 } ;
int cantor( int * a)
{
int ans, i, j, tmp;
ans = 0 ;
for ( i= 0 ; i< n; ++ i) {
tmp = 0 ;
for ( j= i+ 1 ; j< n; ++ j) if ( a[ j] < a[ i] ) tmp++ ;
ans + = fac[ n- i- 1 ] * tmp;
}
return ans + 1 ;
}
string path[ MAXN] ;
bool vis[ MAXN] ;
int dir[ 4 ] [ 2 ] = { { - 1 ,0 } ,{ 1 ,0 } ,{ 0 ,- 1 } ,{ 0 ,1 } } ; //u,d,l,r
char index[ 5 ] = "durl" ; //和上面的要相反,因为是反向搜索:便于输出
void bfs( )
{
int i, j;
queue< node> q;
node cur, next;
for ( i= 1 ; i< n; ++ i) st.s [ i- 1 ] = i % n;
st.loc = 8 ;
st.path = "" ;
st.hf = cantor( st.s ) ;
memset ( vis, 0 , sizeof vis ) ;
vis[ st.hf ] = 1 ;
q.push ( st) ;
int tx, ty, dx, dy;
while ( ! q.empty ( ) ) {
cur = q.front ( ) ;
q.pop ( ) ;
tx = cur.loc / 3 ;
ty = cur.loc % 3 ;
for ( i= 0 ; i< 4 ; ++ i) {
dx = tx + dir[ i] [ 0 ] ;
dy = ty + dir[ i] [ 1 ] ;
if ( dx< 0 || dx> 2 || dy< 0 || dy> 2 ) continue ;
next = cur;
next.loc = dx* 3 + dy;
next.s [ cur.loc ] = next.s [ next.loc ] ;
next.s [ next.loc ] = 0 ;
next.hf = cantor( next.s ) ;
if ( ! vis[ next.hf ] ) {
vis[ next.hf ] = 1 ;
next.path = index[ i] + next.path ;
q.push ( next) ;
path[ next.hf ] = next.path ;
}
}
}
}
int main( )
{
char str[ 100 ] ;
int len, i, j, cnt;
node t;
bfs( ) ;
while ( gets ( str) ) {
len = strlen ( str) ;
cnt = 0 ;
for ( i= 0 ; i< len; ++ i) {
if ( str[ i] >= '1' && str[ i] <= '8' )
t.s [ cnt++ ] = str[ i] - '0' ;
else if ( str[ i] == 'x' ) {
t.s [ cnt] = 0 ;
t.loc = cnt++ ;
}
}
t.hf = cantor( t.s ) ;
if ( vis[ t.hf ] ) {
printf ( "%s\n " ,path[ t.hf ] .c_str ( ) ) ;
} else {
printf ( "unsolvable\n " ) ;
}
}
return 0 ;
}
LyoKQXV0aG9y77yaeWV3MWViIEN1cnJlbnQgVGltZTogMjAxNC4yLjE5CgpoZHUxMDQzIEVpZ2h0CuWboOS4uueKtuaAgeaAu+aVsOS4jeWkmu+8jOWPquacieS4jeWIsDQw5LiH56eNKDkhKe+8jOWboOatpOWPr+S7peS7juebruagh+iKgueCueW8gOWni++8jArov5vooYzkuIDpgY3lvbvlupXnmoTlub/mkJzvvIzmib7lh7rlhajpg6jmnInop6PnirbmgIHliLDnm67moIfoioLngrnnmoTot6/lvoTjgIIKCueKtuaAgeWIpOmHje+8mgpjYW50b3LlsZXlvIAKCuazqOaEj+acieWkmuino++8ge+8gVNwZWNpYWwgSnVkZ2UKKi8KCiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBNQVhOID0gNDAwMDAwOwpjb25zdCBpbnQgbiA9IDk7CnN0cnVjdCBub2RlIHsKICAgIGludCBzWzldOwogICAgaW50IGxvYzsKICAgIGludCBoZjsKICAgIHN0cmluZyBwYXRoOwp9IHN0OwoKCmludCBmYWNbOV09IHsxLDEsMiw2LDI0LDEyMCw3MjAsNTA0MCw0MDMyMH07CgppbnQgY2FudG9yKGludCAqYSkKewogICAgaW50IGFucywgaSwgaiwgdG1wOwogICAgYW5zID0gMDsKICAgIGZvcihpPTA7IGk8bjsgKytpKSB7CiAgICAgICAgdG1wID0gMDsKICAgICAgICBmb3Ioaj1pKzE7IGo8bjsgKytqKSBpZihhW2pdPGFbaV0pIHRtcCsrOwogICAgICAgIGFucyArPSBmYWNbbi1pLTFdKnRtcDsKICAgIH0KICAgIHJldHVybiBhbnMgKyAxOwp9CgpzdHJpbmcgcGF0aFtNQVhOXTsKYm9vbCB2aXNbTUFYTl07CgppbnQgZGlyWzRdWzJdPSB7ey0xLDB9LHsxLDB9LHswLC0xfSx7MCwxfX07IC8vdSxkLGwscgpjaGFyIGluZGV4WzVdPSJkdXJsIjsvL+WSjOS4iumdoueahOimgeebuOWPje+8jOWboOS4uuaYr+WPjeWQkeaQnOe0ojrkvr/kuo7ovpPlh7oKCnZvaWQgYmZzKCkKewogICAgaW50IGksIGo7CiAgICBxdWV1ZTxub2RlPiBxOwogICAgbm9kZSBjdXIsIG5leHQ7CiAgICBmb3IoaT0xOyBpPG47ICsraSkgc3Quc1tpLTFdID0gaSAlIG47CiAgICBzdC5sb2MgPSA4OwogICAgc3QucGF0aCA9ICIiOwogICAgc3QuaGYgPSBjYW50b3Ioc3Qucyk7CiAgICBtZW1zZXQodmlzLCAwLCBzaXplb2YgdmlzICk7CiAgICB2aXNbc3QuaGZdID0gMTsKICAgIHEucHVzaChzdCk7CiAgICBpbnQgdHgsIHR5LCBkeCwgZHk7CiAgICB3aGlsZSghcS5lbXB0eSgpKSB7CiAgICAgICAgY3VyID0gcS5mcm9udCgpOwogICAgICAgIHEucG9wKCk7CiAgICAgICAgdHggPSBjdXIubG9jIC8gMzsKICAgICAgICB0eSA9IGN1ci5sb2MgJSAzOwogICAgICAgIGZvcihpPTA7IGk8NDsgKytpKSB7CiAgICAgICAgICAgIGR4ID0gdHggKyBkaXJbaV1bMF07CiAgICAgICAgICAgIGR5ID0gdHkgKyBkaXJbaV1bMV07CiAgICAgICAgICAgIGlmKGR4PDB8fGR4PjJ8fGR5PDB8fGR5PjIpIGNvbnRpbnVlOwogICAgICAgICAgICBuZXh0ID0gY3VyOwogICAgICAgICAgICBuZXh0LmxvYyA9IGR4KjMgKyBkeTsKICAgICAgICAgICAgbmV4dC5zW2N1ci5sb2NdID0gbmV4dC5zW25leHQubG9jXTsKICAgICAgICAgICAgbmV4dC5zW25leHQubG9jXSA9IDA7CiAgICAgICAgICAgIG5leHQuaGYgPSBjYW50b3IobmV4dC5zKTsKICAgICAgICAgICAgaWYoIXZpc1tuZXh0LmhmXSkgewogICAgICAgICAgICAgICAgdmlzW25leHQuaGZdID0gMTsKICAgICAgICAgICAgICAgIG5leHQucGF0aCA9IGluZGV4W2ldICsgbmV4dC5wYXRoOwogICAgICAgICAgICAgICAgcS5wdXNoKG5leHQpOwogICAgICAgICAgICAgICAgcGF0aFtuZXh0LmhmXSA9IG5leHQucGF0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBjaGFyIHN0clsxMDBdOwogICAgaW50IGxlbiwgaSwgaiwgY250OwogICAgbm9kZSB0OwogICAgYmZzKCk7CiAgICB3aGlsZShnZXRzKHN0cikpIHsKICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICBjbnQgPSAwOwogICAgICAgIGZvcihpPTA7IGk8bGVuOyArK2kpIHsKICAgICAgICAgICAgaWYoc3RyW2ldPj0nMScgJiYgc3RyW2ldPD0nOCcpCiAgICAgICAgICAgICAgICB0LnNbY250KytdID0gc3RyW2ldIC0gJzAnOwogICAgICAgICAgICBlbHNlIGlmKHN0cltpXSA9PSAneCcpIHsKICAgICAgICAgICAgICAgIHQuc1tjbnRdID0gMDsKICAgICAgICAgICAgICAgIHQubG9jID0gY250Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHQuaGYgPSBjYW50b3IodC5zKTsKICAgICAgICBpZih2aXNbdC5oZl0pIHsKICAgICAgICAgICAgcHJpbnRmKCIlc1xuIixwYXRoW3QuaGZdLmNfc3RyKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ZigidW5zb2x2YWJsZVxuIik7CgogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9CgoKCgoKCgoKCgoKCg==
compilation info
prog.cpp:48:13: error: ‘char index [5]’ redeclared as different kind of symbol
char index[5]="durl";//和上面的要相反,因为是反向搜索:便于输出
^
In file included from /usr/include/c++/4.8/cstring:42:0,
from prog.cpp:15:
/usr/include/string.h:478:1: error: previous declaration of ‘const char* index(const char*, int)’
index (const char *__s, int __c) __THROW
^
prog.cpp: In function ‘void bfs()’:
prog.cpp:79:36: error: invalid types ‘<unresolved overloaded function type>[int]’ for array subscript
next.path = index[i] + next.path;
^
prog.cpp:52:12: warning: unused variable ‘j’ [-Wunused-variable]
int i, j;
^
prog.cpp: In function ‘int main()’:
prog.cpp:93:11: warning: ‘char* gets(char*)’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
while(gets(str)) {
^
prog.cpp:93:19: warning: ‘char* gets(char*)’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
while(gets(str)) {
^
prog.cpp:90:17: warning: unused variable ‘j’ [-Wunused-variable]
int len, i, j, cnt;
^
stdout