4 1101 0001 1100 1001
east north
如题 IDA*
广搜获得每个可能降落点的预估值,由边广搜
#include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <string> using namespace std; int dir[4][2]= {0,1,-1,0,1,0,0,-1}; char Map[10][10]; int n,len,ll; char ch[4][10]= {{"east"},{"north"},{"south"},{"west"}}; int vis[10][10],flag[1111]; struct node { int x,y; bool cheak() { if(x>=0&&x<n&&y>=0&&y<n) return true ; return false ; } } a[111]; void bfs(int x,int y) //预处理估计值 { node e; e.x=x,e.y=y; queue<node>q; q.push(e); vis[e.x][e.y]=0; while(q.size()) { e=q.front(); q.pop(); for(int i=0; i<4; i++) { node ee=e; ee.x+=dir[i][0]; ee.y+=dir[i][1]; if(ee.cheak()) { if(Map[ee.x][ee.y]=='0') if(vis[ee.x][ee.y]==-1||vis[ee.x][ee.y]>vis[e.x][e.y]+1) { vis[ee.x][ee.y]=vis[e.x][e.y]+1; q.push(ee); } } } } return ; } int get_h(node * e) { int ans=0; for(int i=0; i<len; i++) { ans=max(vis[e[i].x][e[i].y],ans); } return ans; } bool dfs(int length,node * e) { if(length<get_h(e)) return false ; if(length==0) return true ; for(int i=0; i<4; i++) { node ee[111]; for(int j=0; j<len; j++) { ee[j]=e[j]; ee[j].x+=dir[i][0]; ee[j].y+=dir[i][1]; if(!ee[j].cheak()||e[j].x==0||e[j].y==0||e[j].x==n-1||e[j].y==n-1||Map[ee[j].x][ee[j].y]=='1') //没有达到出口 { ee[j]=e[j]; } } flag[length]=i; if(dfs(length-1,ee)) return true ; } return false ; } int main() { bool ant=false ; while(~scanf("%d",&n)) { if(ant) printf("\n"); ant=true ; for(int i=0; i<n; i++) { getchar(); for(int j=0; j<n; j++) scanf("%c",&Map[i][j]); } memset(vis,-1,sizeof(vis)); len=0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) { if(Map[i][j]=='0'&&(i==0||i==n-1||j==0||j==n-1)) bfs(i,j); else if(Map[i][j]=='0')a[len].x=i,a[len++].y=j; } int length=get_h(a); while(!dfs(length,a)) { length++; } while(length--) { printf("%s\n",ch[flag[length+1]]); } } return 0; }