您的位置:首页 > 其它

poj-3009 Curling 2.0-DFS

2015-08-18 14:25 441 查看
题干很长这里就不复制了,题意的话估计看图就能懂个差不多,这里简单说一下,一个球在2为起点的位置要到达终点3,途中不碰到墙壁球的移动是不会停止的,并且在触碰墙壁停止后,被碰的墙壁会消失。最后得出到达3需要的最少步数。

思路:还是平常的DFS,不过需要多加一点东西就是了,比如点的移动时用一个循环使其向一个方向一直移动到碰到墙或走出边界。该题不需要vis标记数组,因为存在重复走点的情况。注意DFS中加入 if(step>10||step>=ans) return; 可以大大优化时间。(不加一定会TLE)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define INF 0x3f3f3f3f

using namespace std;

int n,m,flag,ans;
int sx,sy;
int Map[50][50];
int vis[50][50];
void DFS(int x,int y,int w,int step)
{
if(step>10||step>=ans) return;
if(Map[x][y]==0||Map[x][y]==3||Map[x][y]==2)
{
while(1)
{
if(Map[x][y]==2)
{Map[x][y]=0;break;}
if(Map[x][y]==1)
{
Map[x][y]=0;
if(w==1) x++;
else if(w==2) y--;
else if(w==3) x--;
else if(w==4) y++;
break;
}
if(Map[x][y]==-1) return ;
if(Map[x][y]==3)
{
flag=1;
if(ans>step) ans=step;
return ;
}
if(w==1) x--;
else if(w==2) y++;
else if(w==3) x++;
else if(w==4) y--;
}
}
if(Map[x-1][y]!=1&&Map[x-1][y]!=-1)
DFS(x-1,y,1,step+1);
if(Map[x][y+1]!=1&&Map[x][y+1]!=-1)
DFS(x,y+1,2,step+1);
if(Map[x+1][y]!=1&&Map[x+1][y]!=-1)
DFS(x+1,y,3,step+1);
if(Map[x][y-1]!=1&&Map[x][y-1]!=-1)
DFS(x,y-1,4,step+1);
if(w==1) Map[x-1][y]=1;
else if(w==2) Map[x][y+1]=1;
else if(w==3) Map[x+1][y]=1;
else if(w==4) Map[x][y-1]=1;
step--;
}
int main()
{
int i,j;
while(scanf("%d%d",&m,&n),m||n)
{
ans=INF;
flag=0;
memset(Map,-1,sizeof(Map));
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
scanf("%d",&Map[i][j]);
if(Map[i][j]==2) sx=i,sy=j;
}
}
DFS(sx,sy,0,0);
if(flag)
{
if(ans<=10)
printf("%d\n",ans);
else
printf("-1\n");
}
else
printf("-1\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: