hdu1813—IDA*

來源:互聯網
上載者:User
//首先把每個在能走點走出去的最小步數求出並儲存//在進行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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.