博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3009
阅读量:6546 次
发布时间:2019-06-24

本文共 1828 字,大约阅读时间需要 6 分钟。

一、题意:给定一个矩形区域,代表冰球场。每个单元格可有四种数值:2是冰球的起始位置;3代表冰球最后需要到达的位置;0代表空,球可通过;1代表障碍物,球碰撞一次后,1变成0,球停在1前面那个位置。球只能上下左右移动(一次朝一个方向移动直至碰到1或者3或者出界为止)。求球从2到3的最短步数(必须小于等于10才算),没有则输出-1;

 

二、思路:遍历球可走的所有情况,找出最短路径。这里需要注意的是步数的回溯。

 

三、代码:

#include"iostream"#include"stdio.h"#include"istream"using namespace std;const int MAXN=25;int filed[MAXN][MAXN];int column,row,sx,sy,ex,ey,steps,miniSteps;bool IsEdge(int x,int y){    if(x>=0&&x
=0&&y
10) return; int dir[8]={0,1,0,-1,1,0,-1,0}; for(int i=0;i<8;i+=2) { int dx=x+dir[i]; int dy=y+dir[i+1]; if(IsEdge(dx,dy)) { if(IsEnd(dx,dy)) { steps++; if(miniSteps>steps) miniSteps=steps; steps--; return; } else if(filed[dx][dy]==0) { while(IsEdge(dx,dy)&&filed[dx][dy]==0) { dx+=dir[i]; dy+=dir[i+1]; } if(IsEdge(dx,dy)) { if(IsEnd(dx,dy)) { steps++; if(miniSteps>steps) miniSteps=steps; steps--; return; } steps++; filed[dx][dy]=0; Dfs(dx-dir[i],dy-dir[i+1]); // cout<
<<' '<
<
>column>>row,column&&row) { for(int i=0;i
>filed[i][j]; if(filed[i][j]==2) { sx=i;sy=j; } if(filed[i][j]==3) { ex=i;ey=j; } } } steps=0; miniSteps=11; filed[sx][sy]=0; Dfs(sx,sy); if(miniSteps<=10) cout<
<

  

转载于:https://www.cnblogs.com/acm-jing/p/9554768.html

你可能感兴趣的文章
第七章:选择器引擎
查看>>
CentOS 7 安装MySQL 5.7.15/MySQLl 5.7.17
查看>>
linux学习一天一个命令(13)[head命令]
查看>>
mysql 数据的批量导入
查看>>
萌新的Linux学习之路(三)
查看>>
This Android SDK requires Android Developer Toolkit version 20.0.0 or above
查看>>
LRM-00109: could not open parameter file
查看>>
数据的加密和解密
查看>>
使用 dell openmanage server administrator 管理 服务器硬盘
查看>>
克隆虚拟机后-没有eth0 网卡的问题
查看>>
线性表的顺序存储
查看>>
SaltStack学习(四)在SaltStack中选择目标主机
查看>>
php 简单的文件上传功能
查看>>
网络安全十大注意
查看>>
cisco虚拟局域网VLAN路由----待补充
查看>>
join命令实现文件内容拼接
查看>>
-bash:wget command not found的解决方法
查看>>
yara规则
查看>>
我的个人简历
查看>>
我的友情链接
查看>>