hdu1813---IDA*

来源:互联网 发布:知乎可以挣钱吗 编辑:程序博客网 时间:2024/05/16 06:13
//首先把每个在能走点走出去的最小步数求出并保存//在进行dfs时,求h()时,即是求当前存在的节点走出去的最小步数中最大者//其他地方和IDA*题一样处理即可,此题就是多了个预处理,首先在记忆化搜索一遍,然后在IDA*#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define inf 12345678using namespace std;int n,m,t;char map[9][9];char dir[5][10]={"east","north","south","west"};int dx[4]={0,-1,1,0},dis[9][9];int dy[4]={1,0,0,-1};int path[1000];struct TPoint{    int x,y;    TPoint(){}    TPoint(int _x,int _y):x(_x),y(_y){}}st,en;queue<TPoint>tpl;void addedge(int u,int v,int val){    dis[u][v]=val;    tpl.push(TPoint(u,v));}bool ismap(int x,int y){    return x>=0&&x<n&&y>=0&&y<n;}bool onedge(int x,int y){    return x==0||y==0||x==n-1||y==n-1;}void bfs(){    int i;    while(!tpl.empty())    {        st=tpl.front(),tpl.pop();        for(i=0;i<4;i++)        {            en.x=st.x+dx[i],en.y=st.y+dy[i];            if(!ismap(en.x,en.y)) continue;            if(!map[en.x][en.y]) continue;            if(dis[en.x][en.y]>dis[st.x][st.y]+1)            {                dis[en.x][en.y]=dis[st.x][st.y]+1;                tpl.push(en);            }        }    }}void init(){    int i,j;    while(!tpl.empty()) tpl.pop();    for(i=0;i<n;i++) for(j=0;j<n;j++)    {        dis[i][j]=inf;        map[i][j]=map[i][j]=='1'?0:1;        if(!map[i][j]) continue;        if(onedge(i,j)) addedge(i,j,0);    }    bfs();}int h(char mid[9][9]){    int i,j,maxf=0;    for(i=0;i<n;i++)    {        for(j=0;j<n;j++)        {            if(mid[i][j]) maxf=max(maxf,dis[i][j]);        }    }    return maxf;}bool dfs(char mid[9][9],int dep){    if(dep+h(mid)>t) return 0;    if(dep==t) return 1;    int i,j,k,l,r;    char cvs[9][9];    for(i=0;i<4;i++)    {        memset(cvs,0,sizeof(cvs));        for(j=0;j<n;j++) for(k=0;k<n;k++)        {            if(onedge(j,k)||!mid[j][k]) continue;            l=j+dx[i],r=k+dy[i];            if(!map[l][r]) cvs[j][k]=1;            else cvs[l][r]=1;        }        path[dep]=i;        if(dfs(cvs,dep+1)) return 1;    }    return 0;}int main(){    int i,end=0;    while(scanf("%d",&n)!=EOF)    {        if(end++) puts("");        for(i=0;i<n;i++) scanf("%s",map[i]);        init();        for(t=0;;t++)        {            if(dfs(map,0)) break;        }        for(i=0;i<t;i++) printf("%s\n",dir[path[i]]);    }    return 0;}
原创粉丝点击