您的位置:首页 > 其它

poj 3009 冰壶 DFS 一个方向搜查到底

2014-04-11 10:39 453 查看
题意:

冰壶可以上下左右运动(前提上下左右的第一个位置为空)。碰到冰块则停止,冰块也将被破坏。问懂多少次能达到终点。

一个方向搜到底:

代码:

#include <iostream>
#include <algorithm>
using namespace std;
int map[30][30];
int w,h;
int minn=300000;
void dfs(int x,int y,int sum,int a,int b)  //a,b记录下一次运动的方向。
{
if(x<0||x>=h||y<0||y>=w||sum>10)
return ;
if(map[x][y]==3)
{
minn=min(sum,minn);
return ;
}
if(map[x+a][y+b]==0||map[x+a][y+b]==3)//如果下一次为空,接着运动。
dfs(x+a,y+b,sum,a,b);
else if(map[x+a][y+b]==1)  //否则,停止,换方向。
{
map[x+a][y+b]=0;
if(map[x+1][y]!=1)
dfs(x,y,sum+1,1,0);
if(map[x-1][y]!=1)
dfs(x,y,sum+1,-1,0);
if(map[x][y+1]!=1)
dfs(x,y,sum+1,0,1);
if(map[x][y-1]!=1)
dfs(x,y,sum+1,0,-1);
map[x+a][y+b]=1;
}
}
int main()
{
while(cin>>w>>h&&w&&h)
{
minn=300000;
int x,y;
memset(map,0,sizeof(map)); //郁闷。没初始化,WA一次。
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
{
cin>>map[i][j];
if(map[i][j]==2)
{
map[i][j]=0;
x=i;
y=j;
}
}
if(map[x+1][y]!=1)   //判断能否运动。
dfs(x,y,1,1,0);
if(map[x-1][y]!=1)
dfs(x,y,1,-1,0);
if(map[x][y+1]!=1)
dfs(x,y,1,0,1);
if(map[x][y-1]!=1)
dfs(x,y,1,0,-1);
if(minn<=10)
cout<<minn<<endl;
else
cout<<"-1\n";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: