| ||||||||||
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 |
A* 900多MS AC汗死我。。我用的是步数+不相同格数启发的,怎么会这么慢啊,大牛帮忙看看,附代码Source Code Problem: 1077 User: yzhw9981 Memory: 9076K Time: 969MS Language: G++ Result: Accepted Source Code # include <iostream> # include <vector> # include <algorithm> using namespace std; char data[11]; int top=-1,last=0,start=0; char stack[500000]; bool hash[500000]; int jie[10]; struct point { int layer; int q; char dir; point* last; char queue[11]; }; bool cmp1(const point *a,const point *b) { return a->q+a->layer>b->q+b->layer; } class heap { private: vector<point*> head; public: void add(point *t) { head.push_back(t); push_heap(head.begin(),head.end(),cmp1); } point *pop() { pop_heap(head.begin(),head.end(),cmp1); point *res=head.back(); head.pop_back(); return res; } int size() { return head.size(); } }; heap refer; int match(int a,int b,char queue[]) { int total=0; if(queue[a]!=a) total++; if(queue[b]!=b) total++; return total; } void puthash(char h[]) { int total=0; for(int i=1;i<=9;i++) { int num=0; for(int j=1;j<i;j++) if(h[j]>h[i]) num++; total+=jie[i-1]*num; } hash[total]=1; } bool hashash(char h[]) { int total=0; for(int i=1;i<=9;i++) { int num=0; for(int j=1;j<i;j++) if(h[j]>h[i]) num++; total+=jie[i-1]*num; } if(hash[total]) return 1; else return 0; } point* det() { int rc=0; while(refer.size()) { point *t=refer.pop(); if(t->q==0) { return t; } if(t->queue[0]+3<=9)//down { point *pos=new point; strcpy(pos->queue,t->queue); pos->queue[t->queue[0]]=t->queue[t->queue[0]+3]; pos->queue[t->queue[0]+3]=t->queue[t->queue[0]]; pos->queue[0]=pos->queue[0]+3; if(hashash(pos->queue)) { delete pos; } else { pos->q=t->q-match(t->queue[0],t->queue[0]+3,t->queue)+match(t->queue[0],t->queue[0]+3,pos->queue); pos->layer=t->layer+1; pos->last=t; pos->dir='d'; puthash(pos->queue); refer.add(pos); } } if(t->queue[0]-3>=1)//up { point *pos=new point; strcpy(pos->queue,t->queue); pos->queue[t->queue[0]]=t->queue[t->queue[0]-3]; pos->queue[t->queue[0]-3]=t->queue[t->queue[0]]; pos->queue[0]=pos->queue[0]-3; if(hashash(pos->queue)) { delete pos; } else { pos->q=t->q-match(t->queue[0],t->queue[0]-3,t->queue)+match(t->queue[0],t->queue[0]-3,pos->queue); pos->layer=t->layer+1; pos->last=t; pos->dir='u'; puthash(pos->queue); refer.add(pos); } } if(t->queue[0]%3==0||t->queue[0]%3==2)//left { point *pos=new point; strcpy(pos->queue,t->queue); pos->queue[t->queue[0]]=t->queue[t->queue[0]-1]; pos->queue[t->queue[0]-1]=t->queue[t->queue[0]]; pos->queue[0]=pos->queue[0]-1; if(hashash(pos->queue)) { delete pos; } else { pos->q=t->q-match(t->queue[0],t->queue[0]-1,t->queue)+match(t->queue[0],t->queue[0]-1,pos->queue); pos->layer=t->layer+1; pos->last=t; pos->dir='l'; puthash(pos->queue); refer.add(pos); } } if(t->queue[0]%3==1||t->queue[0]%3==2)//right { point *pos=new point; strcpy(pos->queue,t->queue); pos->queue[t->queue[0]]=t->queue[t->queue[0]+1]; pos->queue[t->queue[0]+1]=t->queue[t->queue[0]]; pos->queue[0]=pos->queue[0]+1; if(hashash(pos->queue)) { delete pos; } else { pos->q=t->q-match(t->queue[0],t->queue[0]+1,t->queue)+match(t->queue[0],t->queue[0]+1,pos->queue); pos->layer=t->layer+1; pos->last=t; pos->dir='r'; puthash(pos->queue); refer.add(pos); } } } return NULL; } int main() { int q=0; memset(hash,0,sizeof(hash)); point *s=new point; jie[0]=jie[1]=1; for(int i=2;i<=9;i++) jie[i]=jie[i-1]*i; for(int i=1;i<=9;i++) { char temp; cin>>temp; if(temp=='x') { data[0]=i; data[i]=9; } else data[i]=temp-48; } data[10]='\0'; for(int i=1;i<=9;i++) if(data[i]!=i) q++; s->dir='N'; s->layer=0; s->last=NULL; s->q=q; strcpy(s->queue,data); refer.add(s); puthash(data); if(s=det()) { while(s) { stack[++top]=s->dir; s=s->last; } top--; while(top!=-1) cout<<stack[top--]; cout<<endl; } else cout<<"unsolvable"<<endl; system("pause"); } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator