您的位置:首页 > 其它

POJ 3009 Curling 2.0

2017-06-26 19:33 423 查看
题意:给一个h行w列的矩阵,'2'表示起始点,'3'表示终点,'0'表示可达点,'1'表示障碍。从起始点出发,碰到障碍物时才可以改变方向,同时步数加1并消除障碍物,求从起始点到终点的最小步数,如果无法到达终点或者步数超过10就输出-1

解题思路:深搜dfs.虽然是求最小步数,但是并不能用bfs,因为这道题碰到障碍物后,障碍物要改变状态,当搜索完这条路径以后还要还原障碍物的状态,这种需要改变状态的题要用dfs。从起始点开始深搜,遇到障碍物时改变状态,不断更新最小步数,做题时易错的地方见代码注释

代码:

#inc
4000
lude <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;

#define INF 0x3f3f3f3f
int w,h,minstep;
int sx,sy;
int g[25][25];
int dr[]={0,0,1,-1};
int dc[]={1,-1,0,0};
bool inside(int x,int y)
{
return x>=0&&x<h&&y>=0&&y<w;
}
void dfs(int x,int y,int step)//step作为参量
{
if(step>=10)return ;
for(int i=0;i<4;i++)
{
int nx=x+dr[i],ny=y+dc[i];
if(g[nx][ny]==1)continue;//一定要先判断一下,可能一开始g[nx][ny]=1,这样就根本无法往下走
while(inside(nx,ny)&&g[nx][ny]!=1&&g[nx][ny]!=3)//沿着0一直走
{
nx+=dr[i];ny+=dc[i];
}
if(!inside(nx,ny))continue;//如果越界就不用往下进行了
if(g[nx][ny]==3)
{
minstep=min(minstep,step+1);
}
else if(g[nx][ny]==1)
{
g[nx][ny]=0;
dfs(nx-dr[i],ny-dc[i],step+1);//一定要减去最后一步,因为碰到障碍后还是从原先的位置走,不是从障碍的位置走
g[nx][ny]=1;
}
}
}
int main()
{
while(cin>>w>>h&&w+h)
{
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
cin>>g[i][j];
if(g[i][j]==2)sx=i,sy=j;
}
}
minstep=INF;
dfs(sx,sy,0);
if(minstep!=INF)cout<<minstep<<endl;
else cout<<-1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs