题意:从“@”走到'^',问最短步数,所以就是用bfs。途中会遇见A——J和a——j、,分别代表门和钥匙。所以就要用拥有钥匙的状态和没有钥匙的状态,我们用状态压缩来解决。

思路:

首先不知道位运算的需要先学习一下位运算,我的博客里还没有关于位运算的知识点,知识学的不好,不敢随便卖弄,等我深造好了,就出一个。给一个连接吧,我是在上面学的

。http://baike.sogou.com/v576970.htm。

这道题没有想象的那么难,不过是用二进制表示状态,其余的和正常的bfs是一个样子的。

最关键的地方到了哦,就是怎么用二进制表示状态。

1、用到的几个二进制数都是2的n次方,比如1,2,4,8,16.。。。。。这些数的二进制都是一个1和(n-1)个0;

1——1;

2——10;

4——100;

8——1000;

。。。。。。。。

2、需要用的位运算有:<<和‘|’;用法在上面的地址了里,好好研究一下就会懂;

3、遇见a——j时把钥匙吸收进去,很简单。

遇见A——J时随便定义一个变量,把门的号吸收进去,和钥匙的作对比,如果相等的话,则可以打开门。否则不能打开门。

原理:比如有c的钥匙了,那么二进制中第三位就要有一个1,不管途中吸没吸收其他的钥匙,第三位的一是不会变的,那么门上的第三位,吸收进去1还是1,所以二进制是不会改变的,二进制与十进制是一一对应的,那么十进制就不会改变。

至于代码,我认为要是从来没有做过这种题的话,就直接看看吧,看一遍就会了,在找别的题来练练,如果做过别的题的话,这道题并不算难了。

代码如下:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
struct node
{
int x,y;
int step;
int num_key;
};
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int n,m,time;
int x1,x2,y1,y2;
char map[21][21];
int mark[21][21][2000];
bool can_go(int xx,int yy)
{
if(xx>=0&&yy>=0&&xx<n&&yy<m&&map[xx][yy]!='*') return 1;
return 0;
}
int bfs()
{
queue<node>q;
node first,last;
first.x=x1;
first.y=y1;
first.step=0;
first.num_key=0;
mark[first.x][first.y][first.num_key]=1;
q.push(first);
while(!q.empty())
{
first=q.front();
q.pop();
if(first.x==x2&&first.y==y2&&first.step<time)
{
return first.step;
}
for(int i=0;i<4;i++)
{
last.x=first.x+dir[i][0];
last.y=first.y+dir[i][1];
last.step=first.step+1;
last.num_key=first.num_key;
if(can_go(last.x,last.y))
{
if(mark[last.x][last.y][last.num_key]==1) continue;
if(map[last.x][last.y]>='A'&&map[last.x][last.y]<='J')
{
int key;
key=last.num_key|(1<<(map[last.x][last.y]-'A'));//吧门号吸收进去,看看会不会对应位置的二进制数造成影响,从而判断有没有打开这扇门的钥匙。
if(key!=last.num_key) continue;
}
if(map[last.x][last.y]>='a'&&map[last.x][last.y]<='j')
{
last.num_key=last.num_key|(1<<(map[last.x][last.y]-'a'));//吸收钥匙,就是把钥匙编号装换为二进制,加入到队列中。
}
mark[last.x][last.y][last.num_key]=1;
q.push(last);
}
}
}
return -1;
}
int main()
{
int can;
while(scanf("%d%d%d",&n,&m,&time)!=EOF)
{
memset(map,'\0',sizeof(map));
memset(mark,0,sizeof(mark));
for(int i=0;i<n;i++)
{
scanf("%s",&map[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='@')
{
x1=i;y1=j;
}
else if(map[i][j]=='^')
{
x2=i;y2=j;
}
}
}
can=bfs();
printf("%d\n",can);
}
return 0;
}

hdu1429推箱子相关推荐

  1. 推箱子2-向右推!_保持冷静,砍箱子-me脚

    推箱子2-向右推! Hack The Box (HTB) is an online platform allowing you to test your penetration testing ski ...

  2. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  3. 【Python游戏】推箱子—老少皆宜的益智游戏,看你能过几关?

    导语 ​ 要说小时候称霸所有翻盖手机的小游戏,除了贪吃蛇,那就是推箱子了. ​​​控制小人将所有箱子放到指定位置,就是这样简简单单的操作,陪伴我度过了无数个没有动画片的时光. ​ ​ ​这个画面是不是 ...

  4. [HDU 1254] 推箱子

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 1 #include<cstdio> 2 #include<queue> ...

  5. 网易游戏2016实习生招聘笔试题目--推箱子

    题目描述 解题思路 对于输入的状态,找出玩家和箱子的位置,并使用坐标记录其位置,然后对于终端输入的走法,依次判断player按该走法一步一步的移动之后是否能够成功.由于思路比较简单,实际内容就是如何让 ...

  6. 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造

    /*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...

  7. [游戏模版17] Win32 推箱子 迷宫

    >_<:Here introduce a simple game: >_<:resource >_<:only can push a box and finally ...

  8. 使用 C# 开发智能手机软件:推箱子(十二)

    这是"使用 C# 开发智能手机软件:推箱子"系列文章的第十二篇.在这篇文章中,介绍 Window/AboutDlg.cs 源程序文件. 这个源程序文件包括 AboutDlg 类,该 ...

  9. 使用 C# 开发智能手机软件:推箱子(二十三)

    这是"使用 C# 开发智能手机软件:推箱子" 系列文章的第二十三篇.在这篇文章中,介绍 Window/MainForm.Common.cs 源程序文件.这个源程序文件是 MainF ...

  10. 编制一个c语言成绩记录簿_C语言学到什么程度能写推箱子

    大一C语言学到什么程度可以写推箱子 别傻了,学校可不会教你怎么写推箱子,只会让你写个学生信息管理系统 然后你去考二级C语言还可能考不过(话说今天二级出成绩了,附查询链接:成绩查询链接) 言归正传,其实 ...

最新文章

  1. 深度神经网络混合精度训练
  2. 请立即弃用 Notepad++,还有 5 款更牛逼的选择!
  3. LoadRunner学习第四天——检查点学习(转载)
  4. elasticsearch最大节点数_ElasticSearch这些概念要明白
  5. 总结:SpringMVC 中 GET 和 POST 方式请求中的中文乱码问题
  6. 分享10 比较非常实用的 Docker技巧,欢迎收藏!
  7. Katas编写的Java教程:Mars Rover
  8. P1678 烦恼的高考志愿
  9. centos7启用EPEL Repository
  10. python打印9宫格,25宫格等奇数格,且横竖斜相加和相等
  11. 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
  12. NetBeans 时事通讯(刊号 # 120 - Oct 14, 2010)
  13. java oracle11g jar_oracle11g驱动jar包下载
  14. D. Berserk And Fireball(Educational Codeforces Round 91 (Rated for Div. 2))
  15. node 生成随机头像_给微信设置卡通头像,再不怕撞脸!
  16. Linux中将多块新硬盘合并成一个,挂载到/data目录下
  17. 单词快速记忆day 1
  18. Linux配置网络服务
  19. 【面试大全-MQ】-消息队列
  20. 企业经营(数据)分析

热门文章

  1. 【第二周】吴恩达团队AI for Medical Diagnosis课程笔记
  2. 机器学习sklearn----支持向量机SVC模型评估指标
  3. 室内地图导航应用小程序-前端知识体系图
  4. (四.2)计算机组成原理笔记——存储器(静态RAM和动态RAM的区别,动态RAM的刷新, ROM……)
  5. 如何在echarts地图默认的行政区(县)新增一个没有编号的区(如甘肃省天水市的区县新增一个新安区)
  6. 国外遥感影像如何下载之利用USGS网站影像下载无需JAVA
  7. linux微软雅黑字体库_一条命令搞定Linux字体渲染——Ubuntu系发行版微软雅黑+宋体终极解决方案...
  8. 项目设计:基于STM32的指纹/刷卡的门禁/考勤/智能小区管理系统
  9. 雅猴的脚印——2019年下半年
  10. 服务器进入bios修改硬盘启动项,bios设置硬盘启动安装方法