Poj——3009Curling 2.0
Curling 2.0
题目大意:
在二维平面内有一个冰壶开始在起点S,要到终点T,推冰壶冰壶会一直走到出界,碰到障碍物会停下,并且障碍物会消失,求最少多少步完成.
剪枝即可,即$step>ans$回溯即可
#include<iostream> #include<cstdio> using namespace std; int ma[105][105],n,m,sx,sy,ans; int dx[]={0,0,1,-1}, dy[]={1,-1,0,0}; bool judge(int x,int y){ return x>=1&&x<=n&&y>=1&&y<=m; } void dfs(int x,int y,int step){ if(step>=ans) return; for(int i=0;i<4;i++){ int tx=x+dx[i],ty=y+dy[i]; if(judge(tx,ty)&&ma[tx][ty]!=1){ while(true){ if(!judge(tx,ty)) break; if(ma[tx][ty]==3){ ans=min(ans,step); return; } if(ma[tx][ty]==1){ ma[tx][ty]=0; dfs(tx-dx[i],ty-dy[i],step+1); ma[tx][ty]=1; break; } tx+=dx[i],ty+=dy[i]; } } } } int main() { while(scanf("%d%d",&m,&n)==2&&n&&m){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&ma[i][j]); if(ma[i][j]==2) sx=i,sy=j; } ans=11; dfs(sx,sy,1); if(ans==11) printf("%d\n",-1); else printf("%d\n",ans); } return 0; }
博主蒟蒻,若有出错的地方,敬请指出。
如有侵犯您版权的地方,请快速联系我,我会撤回本博文。

浙公网安备 33010602011771号