UVA10085宽搜之八宫格走最远

来源:互联网 发布:银行大数据客户画像 编辑:程序博客网 时间:2024/06/07 16:56

刚开始以为直接宽搜会超时,并不会,直接宽搜,打印路径的话,开个数组记录子节点的父节点,再开一个数组

记录父节点到子节点的方向,然后递归就行了。

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<string>#include<set>#include<map>#include<iostream>#include<algorithm>using namespace std;const int maxn=1e6;int t;set<int> s;int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};int st[maxn][10];int fa[maxn],path[maxn];int ans;char ss[5]="UDLR";bool insert(int *cup){    int sum=0;    for(int i=0;i<9;i++){        sum=sum*10+cup[i];    }    if(s.count(sum)) return 0;    s.insert(sum);    return 1;}void bfs(){    int front=0,rear=1;    while(front<rear){            int zx,zy;         for(int i=0;i<9;i++){            if(!st[front][i]){               zx=i/3,zy =i%3;                break;            }         }        for(int i=0;i<4;i++){                int tx,ty;               tx=zx+dx[i];               ty=zy+dy[i];            if(tx>=0&&tx<3&&ty>=0&&ty<3){                memcpy(st[rear],st[front],sizeof(st[front]));                st[rear][zx*3+zy]=st[front][tx*3+ty];                st[rear][tx*3+ty]=st[front][zx*3+zy];                if(insert(st[rear])){                    fa[rear]=front;                    path[rear]=i;                    rear++;                }            }        }        front++;    }    ans=rear-1;}void print(int cur){    if(cur!=0){        print(fa[cur]);        printf("%c",ss[path[cur]]);    }}int main(){       cin>>t;       int k=0;       while(t--){        for(int i=0;i<9;i++)            cin>>st[0][i];       s.clear();       insert(st[0]);       bfs();       cout<<"Puzzle #"<<++k<<endl;       for(int i=0;i<3;i++)        cout<<st[ans][0+i*3]<<' '<<st[ans][1+i*3]<<' '<<st[ans][2+i*3]<<endl;        print(ans);        cout<<endl<<endl;       }}


0 0
原创粉丝点击