dfs
我使用dfs来做的,因为涉及到Maze的形状时刻在变,撞到block后,该block就消失,用bfs还要保存Maze,不方便
上代码
算水题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f
//0 vacant 1 block 2 start 3 end
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int Map[55][55];
int cnt=0;
int Min;
void dfs(int x,int y,int cnt){
cnt++;
if(cnt>10)return ;
int tx,ty;
for(int i=0;i<4;i++){
tx=x+dir[i][0];
ty=y+dir[i][1];
if(Map[tx][ty]==1)continue;
while(Map[tx][ty]==0||Map[tx][ty]==2){
tx+=dir[i][0];
ty+=dir[i][1];
}
if(Map[tx][ty]<0)continue;
if(Map[tx][ty]==1){
Map[tx][ty]=0;
dfs(tx-dir[i][0],ty-dir[i][1],cnt);
Map[tx][ty]=1;
}
if(Map[tx][ty]==3){
if(cnt<Min)Min=cnt;
continue;
}
}
}
int main(){
int n,m;
while(~scanf("%d%d",&m,&n)&&n&&m){
int mx,my;
Min=inf;
memset(Map,-1,sizeof(Map));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&Map[i][j]);
if(Map[i][j]==2){mx=i,my=j;}
}
dfs(mx,my,0);
if(Min==inf)cout<<-1<<endl;
else printf("%d\n",Min);
}
return 0;
}