| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求救WA??#include<iostream>
#include<math.h>
using namespace std;
int source,dest=87654321;
int ten[10],jie[10],order[9][9];
const int C[]={2,3,2,3,4,3,2,3,2};
const int CC[][4]={{1,3,-1},{0,2,4},{1,5,-1},{0,6,4},{1,3,5,7},{2,4,8,-1},{3,7},{4,6,8},{5,7}};
const char DIR[][4]={{'r','d',-1},{'l','r','d'},{'l','d',-1}
,{'u','d','r'},{'u','l','r','d'},{'u','l','d',-1}
,{'u','r'},{'u','l','r'},{'u','l'}};
struct NODE
{
int data;
int parent;
int step;
char dir;
};
int visit[362880]={0};
int parr[362880]={0};
NODE arr1[362880/2],arr2[362880/2];
int head1=0,tail1=0,head2=0,tail2=0;
int step1=0,step2=0,step;
char oppo(char ch)
{
char re;
if(ch=='l')
re='r';
if(ch=='r')
re='l';
if(ch=='u')
re='d';
if(ch=='d')
re='u';
return re;
}
int hash(int num)
{
int tmp[9],i=0,j=0;
int count=0;
for(i=0;i<9;i++)
{
tmp[i]=(num/ten[i])%10;
}
for(i=0;i<9;i++)
for(j=i+1;j<9;j++)
{
if(tmp[j]>tmp[i])
count+=jie[8-i];
}
return count;
}
int exchange(int num,int i,int j)//i位和j位交换
{
int numi=(num/ten[i])%10;
int numj=(num/ten[j])%10;
num+=numj*ten[i]+numi*ten[j]-numj*ten[j]-numi*ten[i];
return num;
}
void read(int &num)
{
char tmp;
int i=0;
// FILE *pf=fopen(file,"r");
// FILE *pf=stdin;
num=0;
while(scanf("%c",&tmp)!=EOF)
{
if(tmp>'0' && tmp<'9')
num+=(tmp-'0')*ten[i++];
if(tmp=='0' || tmp=='x' || tmp=='X')
i++;
}
}
int rev(int num)
{
int tmp[9],i=0,j=0;
int count=0;
for(i=0;i<9;i++)
{
tmp[i]=(num/ten[i])%10;
}
for(i=0;i<9;i++)
for(j=i+1;j<9;j++)
{
if(tmp[i]!=0 && tmp[j]!=0 && tmp[j]<tmp[i])
count++;
}
return count;
}
bool issov()
{
int a=rev(dest);
int b=rev(source);
int even=abs(rev(source)-rev(dest));
if(even&1)
return false;
return true;
}
void printway(int index1,int index2)
{
char way[100];
int pway=0;
int tmp=index1;
int i;
// cout<<step<<endl;
while(tmp!=-1)
{
way[pway++]=arr1[tmp].dir;
tmp=arr1[tmp].parent;
}
pway--;
for(i=pway-1;i>=0;i--)
cout<<way[i];
pway=0;
tmp=index2;
while(tmp!=-1)
{
//way[pway++]=arr1[tmp].dir;
if(arr2[tmp].dir)
cout<<oppo(arr2[tmp].dir);
tmp=arr2[tmp].parent;
}
}
bool search1()//一次前进一层
{
int tptail=tail1;
step1++;
for(int i=head1;i<=tptail;i++)
{
int b=0;
int current=arr1[i].data;
for(b=0;(current/ten[b])%10;b++);
for(int j=0;j<C[b];j++)
{
int newnode=exchange(current,b,CC[b][j]);
int index=hash(newnode);
++tail1;
arr1[tail1].data=newnode;
arr1[tail1].dir=DIR[b][j];
arr1[tail1].parent=i;
arr1[tail1].step=step1;
if(visit[index]==0)
{
visit[index]=1;
parr[index]=tail2;
}else if(visit[index]<0)//search2访问过了
{
step=step1+arr2[parr[index]].step;
printway(tail1,parr[index]);
return true;
}else
tail1--;
}
}
head1=tptail+1;
return false;
}
bool search2()
{
int tptail=tail2;
step2++;
for(int i=head2;i<=tptail;i++)
{
int b=0;
int current=arr2[i].data;
for(b=0;(current/ten[b])%10;b++);
for(int j=0;j<C[b];j++)
{
int newnode=exchange(current,b,CC[b][j]);
int index=hash(newnode);
++tail2;
arr2[tail2].data=newnode;
arr2[tail2].dir=DIR[b][j];
arr2[tail2].parent=i;
arr2[tail2].step=step2;
if(visit[index]==0)
{
visit[index]=-1;
parr[index]=tail2;
}else if(visit[index]>0)//search1访问过了
{
step=arr1[parr[index]].step+step2;
printway(parr[index],tail2);
return true;
}else
tail2--;
}
}
head2=tptail+1;
return false;
}
void solve()
{
head1=tail1=0;
step1=step2=0;
arr1[0].data=source;
arr1[0].dir=0;
arr1[0].parent=-1;
arr1[0].step=0;
head2=tail2=0;
arr2[0].data=dest;
arr2[0].dir=0;
arr2[0].parent=-1;
arr2[0].step=0;
visit[hash(source)]=1;
visit[hash(dest)]=-1;
parr[hash(source)]=0;
parr[hash(dest)]=0;
while(true)
{
if(search1())
break;
if(search2())
break;
}
}
int main()
{
// freopen("out.txt","w",stdout);
// freopen("start.txt","r",stdin);
int i=0;
ten[0]=1;
for(i=1;i<10;i++)
ten[i]=10*ten[i-1];
jie[0]=1;
for(i=1;i<10;i++)
jie[i]=i*jie[i-1];
read(source);
if(issov())
{
if(source!=dest)
solve();
}else
{
printf("unsolvable");
}
return 1;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator