| ||||||||||
| 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 | |||||||||
Re:BFS也能做到0MS,这个世界太疯狂了,贴代码In Reply To:BFS也能做到0MS,这个世界太疯狂了,贴代码 Posted by:yzhw at 2009-08-05 23:17:26 > Source Code
>
> Problem: 1184 User: yzhw
> Memory: 1476K Time: 0MS
> Language: GCC Result: Accepted
>
> Source Code
> # include <stdio.h>
> # include <stdbool.h>
> typedef struct
> {
> int data;
> int last;
> int step;
> bool find;
> }node;
> node q[100000];
> int h=0,r=0,st,e,std[7];
> int max(int x,int y)
> {
> return x>y?x:y;
> }
> int min(int x,int y)
> {
> return x<y?x:y;
> }
> bool empty()
> {
> return h==r?1:0;
> }
> node pop()
> {
> h=(++h)%100000;
> return q[h];
> }
> void push(node pos)
> {
> r=(++r)%100000;
> q[r]=pos;
> }
> bool used[10000000];
> void change1(node *pos)
> {
> int s[7];
> int i,num=pos->data/10;
> for(i=6;i>=1;i--)
> {
> s[i]=num%10;
> num/=10;
> }
> int temp=s[1];
> s[1]=s[pos->data%10];
> s[pos->data%10]=temp;
> num=0;
> for(i=1;i<=6;i++)
> num=num*10+s[i];
> pos->data=num*10+pos->data%10;
> }
> void change2(node *pos)
> {
> int s[7];
> int i,num=pos->data/10;
> for(i=6;i>=1;i--)
> {
> s[i]=num%10;
> num/=10;
> }
> int temp=s[6];
> s[6]=s[pos->data%10];
> s[pos->data%10]=temp;
> num=0;
> for(i=1;i<=6;i++)
> num=num*10+s[i];
> pos->data=num*10+pos->data%10;
> pos->find=1;
> }
> int cal(node pos)
> {
> int s[7],total=0;
> int i,num=pos.data/10;
> for(i=6;i>=1;i--)
> {
> s[i]=num%10;
> num/=10;
> }
> if(!pos.find)
> {
> for(i=1;i<=6;i++)
> if(s[i]!=std[i])
> {
> if(i>pos.last) return 999999;
> total+=abs(s[i]-std[i]);
> }
> return total;
> }
> else
> {
> for(i=1;i<6;i++)
> if(s[i]!=std[i])
> {
> if(i>pos.last) return 999999;
> total+=abs(s[i]-std[i]);
> }
> total+=abs(s[6]-std[6]);
> return total;
> }
> }
> int main()
> {
> int i;
> scanf("%d %d",&st,&e);
> for(i=6;i>=1;i--)
> std[i]=e%10,e/=10;
> node now,pos;
> int up=9999999;
> now.data=st*10+1;
> now.find=0;
> now.last=1;
> now.step=0;
> used[now.data]=1;
> push(now);
> up=min(cal(now),up);
> while(!empty())
> {
> pos=pop();
> if(pos.step>=up) break;
> int p=pos.data%10;
> if(p!=1)
> {
> now=pos;
> now.step++;
> now.data--;
> if(!used[now.data])
> {
> push(now);
> used[now.data]=1;
> }
> now=pos;
> now.step++;
> change1(&now);
> if(!used[now.data])
> {
> push(now);
> used[now.data]=1;
> up=min(cal(now)+now.step,up);
> }
> }
> if(p!=6)
> {
> now=pos;
> now.step++;
> now.data++;
> now.last=max(now.last,now.data%10);
> if(!used[now.data])
> {
> push(now);
> used[now.data]=1;
> up=min(cal(now)+now.step,up);
> }
> now=pos;
> now.step++;
> change2(&now);
> if(!used[now.data])
> {
> push(now);
> used[now.data]=1;
> up=min(cal(now)+now.step,up);
> }
> }
> }
> printf("%d\n",up);
>
> }
>
>
>
>
>
兄弟你这个代码对吗?
你试试这组数据
700638 815339
答案应该是14吧,你得到的是?北大的数据不严
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator