IDA*搜索。。。
4 1101 0001 1100 1001
east north
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; ///east north south west const int dir_x[4]={0,-1,1,0}; const int dir_y[4]={1,0,0,-1}; int n; struct NODE { int x,y,t; }; bool isBOUND(NODE dian) { if(dian.x==1||dian.y==n||dian.x==n||dian.y==1) return true; return false; } struct MAP { int m[10][10]; void clear(){memset(m,0,sizeof(m));} MAP() {clear();} }M; int minCOST[10][10]; void bfs(int x,int y) { int time=0; bool vis[10][10]; memset(vis,0,sizeof(vis)); queue<NODE> q; q.push((NODE){x,y,0}); while(!q.empty()) { NODE u=q.front(),v; q.pop(); if(isBOUND(u)) { time=u.t; break; } for(int i=0;i<4;i++) { v=u;v.t=u.t+1; v.x=v.x+dir_x[i]; v.y=v.y+dir_y[i]; if(M.m[v.x][v.y]==0&&vis[v.x][v.y]==false) { vis[v.x][v.y]=true; q.push((NODE){v.x,v.y,v.t}); } } } minCOST[x][y]=time; } int deepth=0,mindist; int h(MAP u,int& OK) { int ret=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(u.m[i][j]==0) { if(i>=2&&i<=n-1&&j>=2&&j<=n-1) { OK=1; } ret=max(ret,minCOST[i][j]); } } } return ret; } int ans[1000]; bool dfs(int deep,MAP u) { int OK=0; if(deep+h(u,OK)>deepth) return false; if(OK==0) return true; for(int i=0;i<4;i++) { MAP v; for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) v.m[j][k]=1; ans[deep]=i; for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(u.m[j][k]==0) { if(isBOUND((NODE){j,k,0})) { v.m[j][k]=0; continue; } int X=j+dir_x[i],Y=k+dir_y[i]; if(M.m[X][Y]==0) { v.m[X][Y]=0; } else v.m[j][k]=0; } } } if(dfs(deep+1,v)) return true; } return false; } int main() { int first=1; while(scanf("%d",&n)!=EOF) { mindist=0; if(first) first=0; else putchar(10); for(int i=1;i<=n;i++) { char str[10]; scanf("%s",str); for(int j=0;j<n;j++) M.m[i][j+1]=str[j]-'0'; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(M.m[i][j]==0) { bfs(i,j); mindist=max(mindist,minCOST[i][j]); } deepth=mindist; while(!dfs(0,M)) { deepth++; } for(int i=0;i<deepth;i++) { if(ans[i]==0) puts("east"); else if(ans[i]==1) puts("north"); else if(ans[i]==2) puts("south"); else if(ans[i]==3) puts("west"); } } return 0; }