题目描述:
题目链接:https://vjudge.net/problem/POJ-3009
这道题的意思就是扔冰壶,在遇到障碍物之前要一直前进,碰到障碍物时把那个障碍物校区,然后可以改变方向继续前进,每选择一次方向(包括开始)问能否在十步到达目的地。
题目分析:
这个题直接用DFS搜索最短路就可以了,注意没碰到障碍时不得转向的处理,可以设置一个变量记录方向。还有注意出界的处理(因为这里WA好多次),出界就代表这条路废掉了,要退回去重新选择。
给出代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
int num[30][30];
int MIN=11;
int m,n;
int walk[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int step,int turn)
{
//if(x==2&&y==1)
// cout<<step<<" "<<turn<<endl;
if(x>=m||x<0||y>=n||y<0)
return;
if(step>10||MIN<step)
return;
if(num[x][y]==3)
{
step++;
// cout<<step<<endl;
if(MIN>step)
MIN=step;
return;
}
if(step>10)
return;
if(num[x][y]==2)
{
num[x][y]=0;
for(int i=0; i<4; i++)
{
int x1=x+walk[i][0];
int y1=y+walk[i][1];
if(num[x1][y1]==0||num[x1][y1]==3)
dfs(x1,y1,step,i);
}
return;
}
if(num[x][y]==0)
{
int x1=x+walk[turn][0];
int y1=y+walk[turn][1];
if(x1>=m||x1<0||y1>=n||y1<0)
return;
if(num[x1][y1]==0||num[x1][y1]==3)
dfs(x1,y1,step,turn);
else if(num[x1][y1]==1)
{
num[x1][y1]=0;
for(int i=0;i<4;i++)
{
int x2=x+walk[i][0];
int y2=y+walk[i][1];
//if(num[x2][y2]!=1)
dfs(x2,y2,step+1,i);
}
num[x1][y1]=1;
}
}
return;
}
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
scanf("%d",&num[i][j]);
}
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
if(num[i][j]==2)
{
dfs(i,j,0,0);
}
}
if(MIN!=11)
printf("%d\n",MIN);
else
printf("-1\n");
MIN=11;
}
return 0;
}
本文解析了一道关于冰壶游戏的算法题,通过深度优先搜索(DFS)寻找从起点到终点的最短路径,特别关注了遇到障碍物时的方向调整逻辑及边界条件的处理。
668

被折叠的 条评论
为什么被折叠?



