题目来源:http://poj.org/problem?id=3009
咋一看,求最短路径问题,不假思索地用bfs,但各种MLE、TLE,最后不得不转换思维用dfs+剪枝。
#include <iostream>
using namespace std;
int n,m;
int board[25][25];
int sx,sy;
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
int mins;
void dfs(int x,int y,int step);
int main()
{
while(cin>>m>>n&&n||m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>board[i][j];
if(board[i][j]==2){
sx=i;sy=j;
}
}
}
mins=15;
dfs(sx,sy,0);
if(mins>10) cout<<"-1\n";
else cout<<mins<<endl;
}
return 0;
}
void dfs(int x,int y,int step){
//这里的剪枝非常重要
if(step>10) return;
int tx,ty,i;
for(i=0;i<4;i++){
tx=x+dx[i];ty=y+dy[i];
if(board[tx][ty]==1) continue;
while(tx>=0&&tx<n&&ty>=0&&ty<m){
if(board[tx][ty]==3){
mins=min(mins,step+1);
return;
}
if(board[tx][ty]==1){
board[tx][ty]=0;
dfs(tx-dx[i],ty-dy[i],step+1);
board[tx][ty]=1;
break;
}
tx+=dx[i];ty+=dy[i];
}
}
}