您的位置:首页 > 其它

【DFS】POJ3009-Curling 2.0

2015-08-08 11:20 344 查看
【题目大意】

给出一张地图,一旦往一个方向前进就必须一直向前,直到一下情况发生:(1)碰到了block,则停在block前,该block消失;(2)冲出了场地外;(3)到达了终点。改变方向十次以上或者冲出场外都判输,问至少几步能到达终点,无法到达输出-1。

【思路】

DFS,往四个方向搜索,每次不断向前直到出现如上三种情形,并根据三种情形操作,有点类似于模拟。回溯的时候犯的小错误记在代码的注释里面了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=20+5;
const int INF=0x7fffffff;
int map[MAXN][MAXN];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int line,row,sx,sy;
int ans;

void dfs(int x,int y,int step)
{
if (step>10 || step>ans) return;
for (int i=0;i<4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if (map[tx][ty]==1) continue;
while (tx<line && ty<row && tx>=0 && ty>=0 && map[tx][ty]!=3 && map[tx][ty]!=1)
{
tx+=dx[i];
ty+=dy[i];
}
if (tx==line || ty==row || tx<0 || ty<0) continue;
/*冲出场外判为输*/

if (map[tx][ty]==3)
{
/*到达终点记录最小步数*/
if (step<ans) ans=step;
continue;
}

else if (map[tx][ty]==1)
{
/*碰到障碍物则停在障碍物前,并清除障碍物*/
map[tx][ty]=0;
dfs(tx-dx[i],ty-dy[i],step+1);
map[tx][ty]=1;

/*
map[tx][ty]=0;
tx-=dx[i];
ty-=dy[i];
dfs(tx,ty,step+1);
map[tx+dx[i]][ty+dy[i]]=1;←如上情况是,回溯时千万不要忘记把倒退的步骤加回去
*/

}
}
}

int main()
{
while (scanf("%d%d",&row,&line))
{
if (row==line && line==0) break;
for (int i=0;i<line;i++)
for (int j=0;j<row;j++)
{
scanf("%d",&map[i][j]);
if (map[i][j]==2)
{
sx=i;sy=j;
map[i][j]=0;
}
}
ans=INF;
dfs(sx,sy,1);
if (ans!=INF) cout<<ans<<endl;
else cout<<-1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: