Curling 2.0
来源:互联网 发布:图片二维码识别软件 编辑:程序博客网 时间:2024/04/25 09:55
题意大概是:从点s(2)出发求到达g(3)的最少步数。类似于冰球游戏,只能想周围4个方向上相邻没有障碍(1)的方向扔出石子,可以重复到达同一个点,只有石子碰到障碍或者到达g点,或者出范围了石子才会停下。当石子遇到障碍时,障碍的点由1变0,石子弹回前一格继续搜索。总步数不能超过10.
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int w,h;int a[25][25];//1为障碍,0为无障碍,2是起点,3是终点int x[4]={1,-1,0,0};int y[4]={0,0,1,-1};int ans;//记录最少步数void dfs(int s,int e,int num)//num是当前步数{ if(num>10)return ; if(a[s][e]==3)//当到达终点时更新ans的值 { if(ans>num) ans=num; return ; } for(int k=0;k<4;k++) { int c,d; c=s+x[k]; d=e+y[k]; if(a[c][d]==1||c<0||c>=h||d<0||d>=w)continue;//当有障碍或者出范围的时候,继续跳入下一个方向 if(a[c][d]==3)//如果在走一格就是终点就搜终点,并且跳出循环 { dfs(c,d,num+1); break; } while(a[c][d]==0)//当下一个点是无障碍时 { c+=x[k]; d+=y[k];//继续更新 if(c<0||c>=h||d<0||d>=w)break;//如果超出范围就终止循环 if(a[c][d]==1)//当更新后的点时有障碍时 { a[c][d]=0; dfs(c-x[k],d-y[k],num+1); a[c][d]=1; } if(a[c][d]==3)//当更新后的点是终点 { dfs(c,d,num+1); continue; } } }}int main(){ int s,e; while(scanf("%d%d",&w,&h)!=0) { if(w==0&&h==0) return 0; memset(a,-1,sizeof(a)); for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { cin>>a[i][j]; if(a[i][j]==2) { if(a[i][j]==2) s=i;e=j;a[i][j]=0; } } } ans=11; dfs(s,e,0); if(ans==11)cout<<-1<<endl; else cout<<ans<<endl; } return 0;}
0 0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0
- Curling 2.0{
- Curling 2.0
- Poj 3009 Curling 2.0
- C - Curling 2.0
- Java之五:Java实例化类的方法
- Java之六:Java Reflection
- 分布式系统之四:间接通信
- 分布式系统之五:进程/线程
- 原来恐慌一场
- Curling 2.0
- c# 去除bom文件头
- Windows中的精度定时问题
- 3D建模和3D渲染技术专题一: 热身篇,光线追踪(path Tracing),环境光阴影(ambient occlusion),焦距效果(effect focus)介绍
- JavaScript图片裁剪
- 把一个单词增删改一个字符变为另外一个单词的最小操作次数
- java 递归生成目录
- hdu1505
- 三分搜索