http://poj.org/problem?id=3009
如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍)
#include <cstdio> #include <cstring> using namespace std; const int maxn = 21; int maz[maxn][maxn]; int n,m; const int dx[4] = {1,-1,0,0}; const int dy[4] = {0,0,1,-1}; bool in(int x,int y) { return x >= 0 && x < n && y >= 0 && y < m; } bool dfs(int x,int y,int step) { if(step == 0)return maz[x][y] == 3; for(int i = 0; i < 4; i++) { int tx = x + dx[i],ty = y + dy[i]; if(maz[tx][ty] == 1)continue; while(in(tx,ty) && maz[tx][ty] == 0) { tx += dx[i]; ty += dy[i]; } if(!in(tx,ty))continue; if(maz[tx][ty] == 3)return true; maz[tx][ty] = 0; if(dfs(tx - dx[i],ty - dy[i],step - 1)) { return true; } maz[tx][ty] = 1; } return false; } int main() { while(scanf("%d%d",&m,&n) == 2 && (m || n)) { for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf("%d",maz[i] + j); } } for(int x = 0; x < n; x++) { for(int y = 0; y < m; y++) { if(maz[x][y] == 2) { maz[x][y] = 0; bool fl = false; for(int i = 0; i < 11; i++) { if(dfs(x, y ,i)) { fl = true; printf("%d ",i); break; } } if(!fl) { puts("-1"); } break; } } } } return 0; }