题目请点我
题解:就是裸的深搜,注意看好题目要求条件。
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define MAX 22
#define INF 5000
using namespace std;
int W,H;
int sx,sy;
int es,ey;
int result;
int maze[MAX][MAX];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,-1,0,1};
void dfs(int x,int y,int steps);
bool get_pos(int x,int y,int &nx,int &ny,int dis);
int main()
{
while( scanf("%d%d",&H,&W) != EOF ){
if( H == 0 && W == 0 ){
break;
}
for( int i = 0; i < W; i++ ){
for( int j = 0; j < H; j++ ){
scanf("%d",&maze[i][j]);
if( maze[i][j] == 2 ){
sx = i;sy = j;
}
}
}
result = INF;
dfs(sx,sy,0);
if( result != INF )
printf("%d\n",result);
else
printf("-1\n");
}
return 0;
}
void dfs( int x,int y,int steps){
if( steps > 10 ){
return ;
}
if( maze[x][y] == 3 ){
result = min(result,steps);
return ;
}
for( int i = 0; i < 4; i++ ){
int nx,ny;
int ox,oy;
bool flag = get_pos(x,y,nx,ny,i);
if( (nx == x && ny == y) || !flag ){
continue ;
}
if( maze[nx][ny] != 3 ){
ox = nx+dx[i];
oy = ny+dy[i];
maze[ox][oy] = 0;
}
dfs(nx,ny,steps+1);
if( maze[nx][ny] != 3 ){
maze[ox][oy] = 1;
}
}
return ;
}
bool get_pos(int x,int y,int &nx,int &ny,int dis){
nx = x;
ny = y;
while( 1 ){
nx += dx[dis];
ny += dy[dis];
if( nx<0 || nx>=W || ny<0 || ny>=H ){
nx -= dx[dis];
ny -= dy[dis];
return false;
}
else if( maze[nx][ny] == 1 ){
nx -= dx[dis];
ny -= dy[dis];
return true;
}
else if( maze[nx][ny] == 3 ){
return true;
}
}
}