POJ 3009(Dfs)

来源:互联网 发布:单片机是什么意思 编辑:程序博客网 时间:2024/05/29 12:31

题目链接:http://poj.org/problem?id=3009

题意:冰壶在冰面上滑行,直至遇到石块或者出界才会静止,遇到石块会直接将石块击碎,并且停留与石块的相邻的格子上,给定起点S和终点G,

判断冰壶能否在10次以内从S滑行到G,如果能,求最小次数。

因为每次搜索地图都会改变,所以Bfs行不通,可以用Dfs+回溯来实现这一点。每次向一个方向一直遍历,直至无法滑行,然后改变地图继续搜索,

搜索完之后再回溯还原地图。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int INF=0x3f3f3f3f;const int maxn=25;int T,n,m;int map[maxn][maxn];int sx,sy,ex,ey,minStep;int dx[]={-1,1,0,0};int dy[]={0,0,-1,1};int judge_State(int x,int y){if(x<0||x>=n||y<0||y>=m) return -1;if(map[x][y]==1) return 1;return 0;}void Dfs(int x,int y,int step){if(step>=10) return ;int sign;for(int i=0;i<4;i++){int tmpx=x+dx[i];int tmpy=y+dy[i];if(judge_State(tmpx,tmpy)) continue;while(!(sign=(judge_State(tmpx,tmpy)))){if(tmpx==ex&&tmpy==ey){minStep=min(minStep,step+1);return ;}tmpx=tmpx+dx[i];tmpy=tmpy+dy[i];}if(sign==1){map[tmpx][tmpy]=0;Dfs(tmpx-dx[i],tmpy-dy[i],step+1);map[tmpx][tmpy]=1;}}}int main(){#ifndef ONLINE_JUDGE    freopen("test.in","r",stdin);    freopen("test.out","w",stdout);#endifwhile(~scanf("%d%d",&m,&n)){if(!m&&!n) break;memset(map,0,sizeof(map));for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%d",&map[i][j]);if(map[i][j]==2)sx=i,sy=j;if(map[i][j]==3)ex=i,ey=j;}}minStep=INF;Dfs(sx,sy,0);if(minStep==INF) printf("-1\n");else printf("%d\n",minStep);}return 0;}


0 0
原创粉丝点击