hdu1813 IDA* 好高端的样子。。。

来源:互联网 发布:造价员网络培训 编辑:程序博客网 时间:2024/05/16 18:31


#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;struct st{    st *pre;    int a;}*p1;struct point{    int x,y;    point(){}    point(int a,int b){x=a;y=b;}}p[40];int m[9][9],h[9][9],n,al,pos[4][2]={{0,1},{-1,0},{1,0},{0,-1}};int maxf,nextmaxf,step;char *ans[]={"east","north","south","west"};inline bool inm(point a){    return (a.x>0 && a.x<n-1 && a.y>0 && a.y<n-1);}void init(point a,int x){    if(!inm(a)) return;    if(m[a.x][a.y] || h[a.x][a.y]<=x) return;    h[a.x][a.y]=x;    int i;    for(i=0;i<4;i++) init(point(a.x+pos[i][0],a.y+pos[i][1]),x+1);}void init(){    int i;    for(i=0;i<n;i++) for(int j=0;j<n;j++) h[i][j]=0xfffffff;    for(i=0;i<n;i++)    {        if(m[i][0]==0 && m[i][1]==0) init(point(i,1),1);        if(m[0][i]==0 && m[1][i]==0) init(point(1,i),1);        if(m[i][n-1]==0 && m[i][n-2]==0) init(point(i,n-2),1);        if(m[n-1][i]==0 && m[n-2][i]==0) init(point(n-2,i),1);        h[i][0]=h[0][i]=h[i][n-1]=h[n-1][i]=0;    }}int hh(){    int i,ans=0;    for(i=0;i<al;i++) ans=max(ans,h[p[i].x][p[i].y]);    return ans;}bool dfs(st *pp){    int i,j,f=step+hh();    if(f>maxf)    {        nextmaxf=min(nextmaxf,f);        return 0;    }    if(hh()==0) {p1=pp;return 1;}    step++;    point po[40];    for(i=0;i<4;i++)    {        memcpy(po,p,sizeof(p));        for(j=0;j<al;j++) if(inm(p[j]))        {            int x,y;            x=p[j].x+pos[i][0];            y=p[j].y+pos[i][1];            if(m[x][y]==0) p[j]=point(x,y);        }        p1=new st;        p1->a=i;        p1->pre=pp;        if(dfs(p1)) return 1;        memcpy(p,po,sizeof(p));    }    step--;    return 0;}void print(st *pp){    if(!pp) return;    print(pp->pre);    cout<<ans[pp->a]<<endl;}int main(){    char c;    int pri=0;    while(cin>>n)    {        int i,j;        al=0;        for(i=0;i<n;i++) for(j=0;j<n;j++)        {            cin>>c;            m[i][j]=c-'0';            if(inm(point(i,j)) && m[i][j]==0) p[al++]=point(i,j);        }        if(n<=2)        {            if(pri) cout<<endl;            pri=1;            continue;        }        init();        maxf=hh();        nextmaxf=0xfffffff;        p1=NULL;        step=0;        while(!dfs(p1))        {            maxf=nextmaxf;            nextmaxf=0xfffffff;            p1=NULL;        }        if(pri) cout<<endl;        pri=1;        print(p1);    }    return 0;}


0 0
原创粉丝点击