2448969 | kilvdn | 1077 | Accepted | 4060K | 312MS | G++ | 3335B | 2007-08-05 16:43:39 |
广度优先搜索
#include
<
stdio.h
>
#include < string .h >
#define MAXN 362880
const int tar = 123456789 ,
pw[ 10 ] = ... {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000} ,
jc[ 10 ] = ... {1,1,2,6,24,120,720,5040,40320,362880} ;
int s , st[ 10 ] , que[MAXN][ 3 ] ;
char ch[ 50 ];
bool used[MAXN] ;
bool Isok() ... {
int i , j , sum ;
sum=0 ;
for (i=1;i<10;i++)
for (j=i+1;j<10;j++)...{
if (st[i]>st[j]) sum++ ;
}
if (sum%2==0) return true ;
return false ;
}
int Init() ... {
int len , i , q , c=1;
len=strlen(ch);
s=0;
for (i=0;i<len;i++)...{
if ((ch[i]>='0'&&ch[i]<='9')||ch[i]=='x')...{
if (ch[i]=='x') q=c , st[q]=10 ;
else...{
if (s==0) s=ch[i]-'0';
else s=s*10+ch[i]-'0' ;
st[c]=ch[i]-'0' ;
c++ ;
}
}
}
memset(used,0,sizeof(used));
s=s*10+q ;
// printf("%d ",s);
}
// 1R2L3U4D
int Right( int a ) ... { return a+1 ;}
int Left ( int a) ... { return a-1 ;}
int Up( int a ) ... {
int t1,t2,t3 ;
t1=9-a%10+1 ;
t2=a/pw[t1] ;
t3=t2/1000*1000+t2%100*10+t2/100%10 ;
return t3*pw[t1]+a%pw[t1]/10*10+a%10-3 ;
}
int Down( int a ) ... {
int t1,t2,t3,t4;
t1=9-a%10+1 ;
t2=a/pw[t1] ;
t3=a%pw[t1];
t4=(t3/pw[t1-2]+t3/pw[t1-3]%10*100)*pw[t1-3]+t3%pw[t1-3] ;
return t2*pw[t1]+t4/10*10+a%10+3 ;
}
int Hash( int a) ... {
int t[9] , i , j , k , res=0;
for (i=0;i<9;i++)...{
t[i]=a/pw[8-i]%10 ;
}
for (i=0;i<8;i++)...{
k=0 ;
for (j=0;j<i;j++)
if (t[i]<t[j]) k++ ;
res+=k*jc[i] ;
}
res+=(9-t[8])*jc[8] ;
return res ;
}
int Solve() ... {
int tmp , front ,rear ,i , tt;
que[0][0]=s ;
tt=Hash(s);
used[tt]=1 ;
front=0 , rear=1 ;
while(front<rear)...{
if (que[front][0]==tar) break;
tmp=(que[front][0]%10-1)%3 ;
if (tmp<2)...{
tmp=Right(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=1 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
tmp=(que[front][0]%10-1)%3 ;
if (tmp>0)...{
tmp=Left(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=2 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
tmp=(que[front][0]%10-1)/3 ;
if (tmp<2)...{
tmp=Down(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=4 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
tmp=(que[front][0]%10-1)/3 ;
if (tmp>0)...{
tmp=Up(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=3 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
// printf("%d",rear);
front++;
}
int stack[MAXN],top=0;
rear=front;
while (rear!=0)...{
stack[top++]=que[rear][1];
rear=que[rear][2] ;
}
for (i=top-1;i>=0;i--)...{
switch(stack[i])...{
case 1:putchar('r') ; break;
case 2:putchar('l') ; break;
case 3:putchar('u') ; break;
default:putchar('d');
}
}
printf(" ");
}
int main() ... {
// printf("%d ",Down(123467584));
while (gets(ch))...{
Init();
if(Isok())...{
// printf("yes ");
Solve();
}
else printf("unsolvable ");
}
return 0;
}
/**/ /*
1 2 3 4 6 8 7 5 x
*/
#include < string .h >
#define MAXN 362880
const int tar = 123456789 ,
pw[ 10 ] = ... {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000} ,
jc[ 10 ] = ... {1,1,2,6,24,120,720,5040,40320,362880} ;
int s , st[ 10 ] , que[MAXN][ 3 ] ;
char ch[ 50 ];
bool used[MAXN] ;
bool Isok() ... {
int i , j , sum ;
sum=0 ;
for (i=1;i<10;i++)
for (j=i+1;j<10;j++)...{
if (st[i]>st[j]) sum++ ;
}
if (sum%2==0) return true ;
return false ;
}
int Init() ... {
int len , i , q , c=1;
len=strlen(ch);
s=0;
for (i=0;i<len;i++)...{
if ((ch[i]>='0'&&ch[i]<='9')||ch[i]=='x')...{
if (ch[i]=='x') q=c , st[q]=10 ;
else...{
if (s==0) s=ch[i]-'0';
else s=s*10+ch[i]-'0' ;
st[c]=ch[i]-'0' ;
c++ ;
}
}
}
memset(used,0,sizeof(used));
s=s*10+q ;
// printf("%d ",s);
}
// 1R2L3U4D
int Right( int a ) ... { return a+1 ;}
int Left ( int a) ... { return a-1 ;}
int Up( int a ) ... {
int t1,t2,t3 ;
t1=9-a%10+1 ;
t2=a/pw[t1] ;
t3=t2/1000*1000+t2%100*10+t2/100%10 ;
return t3*pw[t1]+a%pw[t1]/10*10+a%10-3 ;
}
int Down( int a ) ... {
int t1,t2,t3,t4;
t1=9-a%10+1 ;
t2=a/pw[t1] ;
t3=a%pw[t1];
t4=(t3/pw[t1-2]+t3/pw[t1-3]%10*100)*pw[t1-3]+t3%pw[t1-3] ;
return t2*pw[t1]+t4/10*10+a%10+3 ;
}
int Hash( int a) ... {
int t[9] , i , j , k , res=0;
for (i=0;i<9;i++)...{
t[i]=a/pw[8-i]%10 ;
}
for (i=0;i<8;i++)...{
k=0 ;
for (j=0;j<i;j++)
if (t[i]<t[j]) k++ ;
res+=k*jc[i] ;
}
res+=(9-t[8])*jc[8] ;
return res ;
}
int Solve() ... {
int tmp , front ,rear ,i , tt;
que[0][0]=s ;
tt=Hash(s);
used[tt]=1 ;
front=0 , rear=1 ;
while(front<rear)...{
if (que[front][0]==tar) break;
tmp=(que[front][0]%10-1)%3 ;
if (tmp<2)...{
tmp=Right(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=1 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
tmp=(que[front][0]%10-1)%3 ;
if (tmp>0)...{
tmp=Left(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=2 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
tmp=(que[front][0]%10-1)/3 ;
if (tmp<2)...{
tmp=Down(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=4 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
tmp=(que[front][0]%10-1)/3 ;
if (tmp>0)...{
tmp=Up(que[front][0]);
tt=Hash(tmp);
if (!used[tt])...{
used[tt]=1;
que[rear][0]=tmp ;
que[rear][1]=3 ;
que[rear][2]=front ;
rear++ ;
// if (tmp==tar) break;
}
}
// printf("%d",rear);
front++;
}
int stack[MAXN],top=0;
rear=front;
while (rear!=0)...{
stack[top++]=que[rear][1];
rear=que[rear][2] ;
}
for (i=top-1;i>=0;i--)...{
switch(stack[i])...{
case 1:putchar('r') ; break;
case 2:putchar('l') ; break;
case 3:putchar('u') ; break;
default:putchar('d');
}
}
printf(" ");
}
int main() ... {
// printf("%d ",Down(123467584));
while (gets(ch))...{
Init();
if(Isok())...{
// printf("yes ");
Solve();
}
else printf("unsolvable ");
}
return 0;
}
/**/ /*
1 2 3 4 6 8 7 5 x
*/
双向广度优先搜索
2451174 | kilvdn | 1077 | Accepted | 5136K | 296MS | G++ | 5518B | 2007-08-05 19:13:22 |
#include
<
stdio.h
>
#include < string .h >
#define MAXN 362880
const int tar = 123456789 ,
pw[ 10 ] = { 1 , 10 , 100 , 1000 , 10000 , 100000 , 1000000 , 10000000 , 100000000 , 1000000000 },
jc[ 10 ] = { 1 , 1 , 2 , 6 , 24 , 120 , 720 , 5040 , 40320 , 362880 };
int s , st[ 10 ] , que[MAXN][ 3 ] , q1[MAXN][ 3 ];
char ch[ 50 ];
int used[MAXN] ;
bool Isok(){
int i , j , sum ;
sum = 0 ;
for (i = 1 ;i < 10 ;i ++ )
for (j = i + 1 ;j < 10 ;j ++ ){
if (st[i] > st[j]) sum ++ ;
}
if (sum % 2 == 0 ) return true ;
return false ;
}
int Init(){
int len , i , q , c = 1 ;
len = strlen(ch);
s = 0 ;
for (i = 0 ;i < len;i ++ ){
if ((ch[i] >= ' 0 ' && ch[i] <= ' 9 ' ) || ch[i] == ' x ' ){
if (ch[i] == ' x ' ) q = c , st[q] = 10 ;
else {
if (s == 0 ) s = ch[i] - ' 0 ' ;
else s = s * 10 + ch[i] - ' 0 ' ;
st[c] = ch[i] - ' 0 ' ;
c ++ ;
}
}
}
memset(used, 0 , sizeof (used));
s = s * 10 + q ;
}
// 1R2L3U4D
int Right( int a ){ return a + 1 ;}
int Left ( int a){ return a - 1 ;}
int Up( int a ){
int t1,t2,t3 ;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = t2 / 1000 * 1000 + t2 % 100 * 10 + t2 / 100 % 10 ;
return t3 * pw[t1] + a % pw[t1] / 10 * 10 + a % 10 - 3 ;
}
int Down( int a ){
int t1,t2,t3,t4;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = a % pw[t1];
t4 = (t3 / pw[t1 - 2 ] + t3 / pw[t1 - 3 ] % 10 * 100 ) * pw[t1 - 3 ] + t3 % pw[t1 - 3 ] ;
return t2 * pw[t1] + t4 / 10 * 10 + a % 10 + 3 ;
}
int Hash( int a){
int t[ 9 ] , i , j , k , res = 0 ;
for (i = 0 ;i < 9 ;i ++ ){
t[i] = a / pw[ 8 - i] % 10 ;
}
for (i = 0 ;i < 8 ;i ++ ){
k = 0 ;
for (j = 0 ;j < i;j ++ )
if (t[i] < t[j]) k ++ ;
res += k * jc[i] ;
}
res += ( 9 - t[ 8 ]) * jc[ 8 ] ;
return res ;
}
int Solve(){
int tmp , front ,rear ,i , tt , f1 , r1 ;
if (s == tar) {
printf( " " );
return 1 ;
}
que[ 0 ][ 0 ] = s ;
tt = Hash(s);
used[tt] = 1 ;
tt = Hash(tar);
used[tt] = 2 ;
q1[ 0 ][ 0 ] = tar ;
f1 = 0 , r1 = 1 ;
front = 0 , rear = 1 ;
while ( 1 ){
if (rear - front >= r1 - f1){
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp < 2 ){
tmp = Right(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 1 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 1 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp > 0 ){
tmp = Left(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 2 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 2 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp < 2 ){
tmp = Down(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 4 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 4 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp > 0 ){
tmp = Up(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 3 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 3 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
front ++ ;
}
else {
tmp = (q1[f1][ 0 ] % 10 - 1 ) % 3 ;
if (tmp < 2 ){
tmp = Right(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 1 ;
q1[r1][ 2 ] = f1 ;
r1 ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 1 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
tmp = (q1[f1][ 0 ] % 10 - 1 ) % 3 ;
if (tmp > 0 ){
tmp = Left(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 2 ;
q1[r1][ 2 ] = f1 ;
r1 ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 2 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
tmp = (q1[f1][ 0 ] % 10 - 1 ) / 3 ;
if (tmp < 2 ){
tmp = Down(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 4 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 4 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
tmp = (q1[f1][ 0 ] % 10 - 1 ) / 3 ;
if (tmp > 0 ){
tmp = Up(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 3 ;
q1[r1][ 2 ] = f1 ;
r1 ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 3 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
f1 ++ ;
}
}
for (i = rear;i >= 0 ;i -- )
if (que[i][ 0 ] == tmp) break ;
int stack[MAXN],top = 0 ;
rear = i;
while (rear != 0 ){
stack[top ++ ] = que[rear][ 1 ];
rear = que[rear][ 2 ] ;
}
for (i = top - 1 ;i >= 0 ;i -- ){
switch (stack[i]){
case 1 :putchar( ' r ' ) ; break ;
case 2 :putchar( ' l ' ) ; break ;
case 3 :putchar( ' u ' ) ; break ;
default :putchar( ' d ' );
}
}
for (i = r1;i >= 0 ;i -- )
if (q1[i][ 0 ] == tmp) break ;
while (i != 0 ){
switch (q1[i][ 1 ]){
case 1 :putchar( ' l ' ) ; break ;
case 2 :putchar( ' r ' ) ; break ;
case 3 :putchar( ' d ' ) ; break ;
default :putchar( ' u ' );
}
i = q1[i][ 2 ];
}
printf( " " );
}
int main(){
while (gets(ch)){
Init();
printf( " %d " ,Hash(s));
if (Isok()){
Solve();
}
else printf( " unsolvable " );
}
return 0 ;
}
/*
1 2 3 4 6 8 7 5 x
2 3 4 1 5 x 7 6 8
uldr
*/
#include < string .h >
#define MAXN 362880
const int tar = 123456789 ,
pw[ 10 ] = { 1 , 10 , 100 , 1000 , 10000 , 100000 , 1000000 , 10000000 , 100000000 , 1000000000 },
jc[ 10 ] = { 1 , 1 , 2 , 6 , 24 , 120 , 720 , 5040 , 40320 , 362880 };
int s , st[ 10 ] , que[MAXN][ 3 ] , q1[MAXN][ 3 ];
char ch[ 50 ];
int used[MAXN] ;
bool Isok(){
int i , j , sum ;
sum = 0 ;
for (i = 1 ;i < 10 ;i ++ )
for (j = i + 1 ;j < 10 ;j ++ ){
if (st[i] > st[j]) sum ++ ;
}
if (sum % 2 == 0 ) return true ;
return false ;
}
int Init(){
int len , i , q , c = 1 ;
len = strlen(ch);
s = 0 ;
for (i = 0 ;i < len;i ++ ){
if ((ch[i] >= ' 0 ' && ch[i] <= ' 9 ' ) || ch[i] == ' x ' ){
if (ch[i] == ' x ' ) q = c , st[q] = 10 ;
else {
if (s == 0 ) s = ch[i] - ' 0 ' ;
else s = s * 10 + ch[i] - ' 0 ' ;
st[c] = ch[i] - ' 0 ' ;
c ++ ;
}
}
}
memset(used, 0 , sizeof (used));
s = s * 10 + q ;
}
// 1R2L3U4D
int Right( int a ){ return a + 1 ;}
int Left ( int a){ return a - 1 ;}
int Up( int a ){
int t1,t2,t3 ;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = t2 / 1000 * 1000 + t2 % 100 * 10 + t2 / 100 % 10 ;
return t3 * pw[t1] + a % pw[t1] / 10 * 10 + a % 10 - 3 ;
}
int Down( int a ){
int t1,t2,t3,t4;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = a % pw[t1];
t4 = (t3 / pw[t1 - 2 ] + t3 / pw[t1 - 3 ] % 10 * 100 ) * pw[t1 - 3 ] + t3 % pw[t1 - 3 ] ;
return t2 * pw[t1] + t4 / 10 * 10 + a % 10 + 3 ;
}
int Hash( int a){
int t[ 9 ] , i , j , k , res = 0 ;
for (i = 0 ;i < 9 ;i ++ ){
t[i] = a / pw[ 8 - i] % 10 ;
}
for (i = 0 ;i < 8 ;i ++ ){
k = 0 ;
for (j = 0 ;j < i;j ++ )
if (t[i] < t[j]) k ++ ;
res += k * jc[i] ;
}
res += ( 9 - t[ 8 ]) * jc[ 8 ] ;
return res ;
}
int Solve(){
int tmp , front ,rear ,i , tt , f1 , r1 ;
if (s == tar) {
printf( " " );
return 1 ;
}
que[ 0 ][ 0 ] = s ;
tt = Hash(s);
used[tt] = 1 ;
tt = Hash(tar);
used[tt] = 2 ;
q1[ 0 ][ 0 ] = tar ;
f1 = 0 , r1 = 1 ;
front = 0 , rear = 1 ;
while ( 1 ){
if (rear - front >= r1 - f1){
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp < 2 ){
tmp = Right(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 1 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 1 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp > 0 ){
tmp = Left(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 2 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 2 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp < 2 ){
tmp = Down(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 4 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 4 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp > 0 ){
tmp = Up(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 3 ;
que[rear][ 2 ] = front ;
rear ++ ;
}
else if (used[tt] == 2 ){
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 3 ;
que[rear][ 2 ] = front ;
rear ++ ;
break ;
}
}
front ++ ;
}
else {
tmp = (q1[f1][ 0 ] % 10 - 1 ) % 3 ;
if (tmp < 2 ){
tmp = Right(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 1 ;
q1[r1][ 2 ] = f1 ;
r1 ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 1 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
tmp = (q1[f1][ 0 ] % 10 - 1 ) % 3 ;
if (tmp > 0 ){
tmp = Left(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 2 ;
q1[r1][ 2 ] = f1 ;
r1 ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 2 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
tmp = (q1[f1][ 0 ] % 10 - 1 ) / 3 ;
if (tmp < 2 ){
tmp = Down(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 4 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 4 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
tmp = (q1[f1][ 0 ] % 10 - 1 ) / 3 ;
if (tmp > 0 ){
tmp = Up(q1[f1][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 2 ;
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 3 ;
q1[r1][ 2 ] = f1 ;
r1 ++ ;
}
else if (used[tt] == 1 ){
q1[r1][ 0 ] = tmp ;
q1[r1][ 1 ] = 3 ;
q1[r1][ 2 ] = f1 ;
rear ++ ;
break ;
}
}
f1 ++ ;
}
}
for (i = rear;i >= 0 ;i -- )
if (que[i][ 0 ] == tmp) break ;
int stack[MAXN],top = 0 ;
rear = i;
while (rear != 0 ){
stack[top ++ ] = que[rear][ 1 ];
rear = que[rear][ 2 ] ;
}
for (i = top - 1 ;i >= 0 ;i -- ){
switch (stack[i]){
case 1 :putchar( ' r ' ) ; break ;
case 2 :putchar( ' l ' ) ; break ;
case 3 :putchar( ' u ' ) ; break ;
default :putchar( ' d ' );
}
}
for (i = r1;i >= 0 ;i -- )
if (q1[i][ 0 ] == tmp) break ;
while (i != 0 ){
switch (q1[i][ 1 ]){
case 1 :putchar( ' l ' ) ; break ;
case 2 :putchar( ' r ' ) ; break ;
case 3 :putchar( ' d ' ) ; break ;
default :putchar( ' u ' );
}
i = q1[i][ 2 ];
}
printf( " " );
}
int main(){
while (gets(ch)){
Init();
printf( " %d " ,Hash(s));
if (Isok()){
Solve();
}
else printf( " unsolvable " );
}
return 0 ;
}
/*
1 2 3 4 6 8 7 5 x
2 3 4 1 5 x 7 6 8
uldr
*/
A*算法
2451851 | kilvdn | 1077 | Accepted | 1980K | 0MS | G++ | 4512B | 2007-08-05 20:36:57 |
#include
<
cstdio
>
#include < cstdlib >
#include < cstring >
#include < algorithm >
using namespace std;
#define MAXN 362880
const int tar = 123456789 ,
pw[ 10 ] = { 1 , 10 , 100 , 1000 , 10000 , 100000 , 1000000 , 10000000 , 100000000 , 1000000000 },
jc[ 10 ] = { 1 , 1 , 2 , 6 , 24 , 120 , 720 , 5040 , 40320 , 362880 };
int s , st[ 10 ] , que[MAXN][ 4 ] , rear , front;
char ch[ 50 ];
bool used[MAXN] ;
typedef struct {
int pos,v ;
}T ;
T heap[MAXN];
int hp = 0 ;
int cmp ( const T & a, const T & b ){
return a.v > b.v;
}
bool Isok(){
int i , j , sum ;
sum = 0 ;
for (i = 1 ;i < 10 ;i ++ )
for (j = i + 1 ;j < 10 ;j ++ ){
if (st[i] > st[j]) sum ++ ;
}
if (sum % 2 == 0 ) return true ;
return false ;
}
int Init(){
int len , i , q , c = 1 ;
len = strlen(ch);
s = 0 ;
for (i = 0 ;i < len;i ++ ){
if ((ch[i] >= ' 0 ' && ch[i] <= ' 9 ' ) || ch[i] == ' x ' ){
if (ch[i] == ' x ' ) q = c , st[q] = 10 ;
else {
if (s == 0 ) s = ch[i] - ' 0 ' ;
else s = s * 10 + ch[i] - ' 0 ' ;
st[c] = ch[i] - ' 0 ' ;
c ++ ;
}
}
}
memset(used, 0 , sizeof (used));
s = s * 10 + q ;
}
/*
astar 算法估价函数
*/
int Value( int a){
int t[ 9 ] , i , j , p;
for (i = 0 ;i < 9 ;i ++ ){
t[i] = a / pw[ 8 - i] % 10 ;
}
for (p = 0 , i = 0 ; i < 9 ; i ++ ){
if (t[i] == ' x ' ) continue ;
if (t[i] != i + 1 ){
j = t[i] - ' 1 ' ;
p += abs(i / 3 - j / 3 ) + abs(i % 3 - j % 3 );
}
}
return p ;
}
// 1R2L3U4D
int Right( int a ){ return a + 1 ;}
int Left ( int a){ return a - 1 ;}
int Up( int a ){
int t1,t2,t3 ;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = t2 / 1000 * 1000 + t2 % 100 * 10 + t2 / 100 % 10 ;
return t3 * pw[t1] + a % pw[t1] / 10 * 10 + a % 10 - 3 ;
}
int Down( int a ){
int t1,t2,t3,t4;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = a % pw[t1];
t4 = (t3 / pw[t1 - 2 ] + t3 / pw[t1 - 3 ] % 10 * 100 ) * pw[t1 - 3 ] + t3 % pw[t1 - 3 ] ;
return t2 * pw[t1] + t4 / 10 * 10 + a % 10 + 3 ;
}
int Hash( int a){
int t[ 9 ] , i , j , k , res = 0 ;
for (i = 0 ;i < 9 ;i ++ ){
t[i] = a / pw[ 8 - i] % 10 ;
}
for (i = 0 ;i < 8 ;i ++ ){
k = 0 ;
for (j = 0 ;j < i;j ++ )
if (t[i] < t[j]) k ++ ;
res += k * jc[i] ;
}
res += ( 9 - t[ 8 ]) * jc[ 8 ] ;
return res ;
}
bool Find( int front){
int tmp , tt;
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp < 2 ){
tmp = Right(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 1 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp > 0 ){
tmp = Left(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 2 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp < 2 ){
tmp = Down(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 4 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp > 0 ){
tmp = Up(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 3 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
return false ;
}
/*
A* 算法
*/
int Solve(){
int i,tt;
T tm;
que[ 0 ][ 0 ] = s ;
que[ 0 ][ 3 ] = 0 ;
tt = Hash(s);
used[tt] = 1 ;
hp = 0 ;
front = 0 , rear = 1 ;
while (que[front][ 0 ] != tar){
Find(front) ;
front = heap[ 0 ].pos ;
// printf("%d %d ",heap[0].pos , heap[0].v ) ;
pop_heap(heap,heap + (hp -- ),cmp);
}
int stack[MAXN],top = 0 ;
rear = front ;
while (rear != 0 ){
stack[top ++ ] = que[rear][ 1 ];
rear = que[rear][ 2 ] ;
}
for (i = top - 1 ;i >= 0 ;i -- ){
switch (stack[i]){
case 1 :putchar( ' r ' ) ; break ;
case 2 :putchar( ' l ' ) ; break ;
case 3 :putchar( ' u ' ) ; break ;
default :putchar( ' d ' );
}
}
printf( " " );
}
int main(){
while (gets(ch)){
Init();
if (Isok()){
Solve();
}
else printf( " unsolvable " );
}
return 0 ;
}
/*
1 2 3 4 6 8 7 5 x
*/
#include < cstdlib >
#include < cstring >
#include < algorithm >
using namespace std;
#define MAXN 362880
const int tar = 123456789 ,
pw[ 10 ] = { 1 , 10 , 100 , 1000 , 10000 , 100000 , 1000000 , 10000000 , 100000000 , 1000000000 },
jc[ 10 ] = { 1 , 1 , 2 , 6 , 24 , 120 , 720 , 5040 , 40320 , 362880 };
int s , st[ 10 ] , que[MAXN][ 4 ] , rear , front;
char ch[ 50 ];
bool used[MAXN] ;
typedef struct {
int pos,v ;
}T ;
T heap[MAXN];
int hp = 0 ;
int cmp ( const T & a, const T & b ){
return a.v > b.v;
}
bool Isok(){
int i , j , sum ;
sum = 0 ;
for (i = 1 ;i < 10 ;i ++ )
for (j = i + 1 ;j < 10 ;j ++ ){
if (st[i] > st[j]) sum ++ ;
}
if (sum % 2 == 0 ) return true ;
return false ;
}
int Init(){
int len , i , q , c = 1 ;
len = strlen(ch);
s = 0 ;
for (i = 0 ;i < len;i ++ ){
if ((ch[i] >= ' 0 ' && ch[i] <= ' 9 ' ) || ch[i] == ' x ' ){
if (ch[i] == ' x ' ) q = c , st[q] = 10 ;
else {
if (s == 0 ) s = ch[i] - ' 0 ' ;
else s = s * 10 + ch[i] - ' 0 ' ;
st[c] = ch[i] - ' 0 ' ;
c ++ ;
}
}
}
memset(used, 0 , sizeof (used));
s = s * 10 + q ;
}
/*
astar 算法估价函数
*/
int Value( int a){
int t[ 9 ] , i , j , p;
for (i = 0 ;i < 9 ;i ++ ){
t[i] = a / pw[ 8 - i] % 10 ;
}
for (p = 0 , i = 0 ; i < 9 ; i ++ ){
if (t[i] == ' x ' ) continue ;
if (t[i] != i + 1 ){
j = t[i] - ' 1 ' ;
p += abs(i / 3 - j / 3 ) + abs(i % 3 - j % 3 );
}
}
return p ;
}
// 1R2L3U4D
int Right( int a ){ return a + 1 ;}
int Left ( int a){ return a - 1 ;}
int Up( int a ){
int t1,t2,t3 ;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = t2 / 1000 * 1000 + t2 % 100 * 10 + t2 / 100 % 10 ;
return t3 * pw[t1] + a % pw[t1] / 10 * 10 + a % 10 - 3 ;
}
int Down( int a ){
int t1,t2,t3,t4;
t1 = 9 - a % 10 + 1 ;
t2 = a / pw[t1] ;
t3 = a % pw[t1];
t4 = (t3 / pw[t1 - 2 ] + t3 / pw[t1 - 3 ] % 10 * 100 ) * pw[t1 - 3 ] + t3 % pw[t1 - 3 ] ;
return t2 * pw[t1] + t4 / 10 * 10 + a % 10 + 3 ;
}
int Hash( int a){
int t[ 9 ] , i , j , k , res = 0 ;
for (i = 0 ;i < 9 ;i ++ ){
t[i] = a / pw[ 8 - i] % 10 ;
}
for (i = 0 ;i < 8 ;i ++ ){
k = 0 ;
for (j = 0 ;j < i;j ++ )
if (t[i] < t[j]) k ++ ;
res += k * jc[i] ;
}
res += ( 9 - t[ 8 ]) * jc[ 8 ] ;
return res ;
}
bool Find( int front){
int tmp , tt;
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp < 2 ){
tmp = Right(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 1 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) % 3 ;
if (tmp > 0 ){
tmp = Left(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 2 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp < 2 ){
tmp = Down(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 4 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
tmp = (que[front][ 0 ] % 10 - 1 ) / 3 ;
if (tmp > 0 ){
tmp = Up(que[front][ 0 ]);
tt = Hash(tmp);
if ( ! used[tt]){
used[tt] = 1 ;
que[rear][ 0 ] = tmp ;
que[rear][ 1 ] = 3 ;
que[rear][ 2 ] = front ;
que[rear][ 3 ] = que[front][ 3 ] + 1 ;
heap[hp].v = 10 * Value(tmp) + que[rear][ 3 ];
heap[hp].pos = rear;
push_heap(heap,heap + ( ++ hp),cmp);
rear ++ ;
}
}
return false ;
}
/*
A* 算法
*/
int Solve(){
int i,tt;
T tm;
que[ 0 ][ 0 ] = s ;
que[ 0 ][ 3 ] = 0 ;
tt = Hash(s);
used[tt] = 1 ;
hp = 0 ;
front = 0 , rear = 1 ;
while (que[front][ 0 ] != tar){
Find(front) ;
front = heap[ 0 ].pos ;
// printf("%d %d ",heap[0].pos , heap[0].v ) ;
pop_heap(heap,heap + (hp -- ),cmp);
}
int stack[MAXN],top = 0 ;
rear = front ;
while (rear != 0 ){
stack[top ++ ] = que[rear][ 1 ];
rear = que[rear][ 2 ] ;
}
for (i = top - 1 ;i >= 0 ;i -- ){
switch (stack[i]){
case 1 :putchar( ' r ' ) ; break ;
case 2 :putchar( ' l ' ) ; break ;
case 3 :putchar( ' u ' ) ; break ;
default :putchar( ' d ' );
}
}
printf( " " );
}
int main(){
while (gets(ch)){
Init();
if (Isok()){
Solve();
}
else printf( " unsolvable " );
}
return 0 ;
}
/*
1 2 3 4 6 8 7 5 x
*/