求解解救amaze问题求解饥饿的小易问题
求解饥饿的小易问题
题目描述
小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7。因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次。贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳。
输入描述:
输入一个初始位置x_0,范围在1到1,000,000,006输出描述:
输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到贝壳,则输出-1示例1
输入
125000000输出
12、主要思想:
(1)BFS思想,这一点很容易想到。
(2)对于已经访问过的节点,要用一个set进行记录,这样减少非常的多的重复计算,而且未被访问的节点队列queue才不会超级长。
import java.util.*;public class HungriedXiaoYi {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);long x;Set<Long> occur=new HashSet<Long>();Queue<Long> queue=new LinkedList<Long>();while (scanner.hasNextLong()){x=scanner.nextLong(); int front=-1,rear=-1;int last=0,level=0;queue.add(x%1000000007);rear++;occur.add(x%1000000007);while (level<100001 && !queue.isEmpty()){long loc=queue.poll();front++;if(loc==0){ System.out.println(level);break;}else{if(!occur.contains((4 * loc + 3)%1000000007)) {queue.add((4 * loc + 3) % 1000000007);occur.add((4*loc+3)%1000000007);rear++;}if(!occur.contains((8 * loc + 7)%1000000007)){queue.add((8 * loc + 7)%1000000007);occur.add((8*loc+7)%1000000007);rear++;}}if(front==last){level++;last=rear;}}if(level==100001 || (level<=100000 && queue.isEmpty()))System.out.println(-1);queue.clear();occur.clear();}} }
求解解救amaze问题
问题描述:原始森林中有很多树,如线段树、后缀树和红黑树等,你掌握了所有的树吗?别担心,本问题不会谈论树,而是介绍原始森林中的一些动物,第1种是金刚,金刚是一种危险的动物,如果你遇到金刚,你会死的。第2种是野狗,它不会祥金刚那么危险,但它会咬你。
Amaze是一个美国的女孩,她不幸迷失于原始森林中。Magicpig非常担心她,他要到原始森林找她。Magicpig知道如果遇到金刚他会死的,野狗也会咬他,而且咬了两次之后他也会死的。Magicpig是多么可怜!
输入的第1行是单个数字t(0<=t<=20),表示测试用例的数目。
每个测试用例是一个Magicpig地图,之前的一行指出n(0<n<=30),原始森林是一个n*n单元矩阵,其中:
(1). p表示Magicpig。
(2). a表示Amaze。
(3). r表示道路。
(4). k表示金刚。
(5). d表示野狗。
请注意,Magicpig只能在上、下、左、右4个方向移动。
对于每个测试用例,如果Magicpig能够找到Amaze,则在一行中输出“Yes”,否则在一行中输出“No”。输入样本:
4
3
pkk
rrd
rda
3
prr
kkk
rra
4
prrr
rrrr
rrrr
arrr
5
prrrr
ddddd
ddddd
rrrrr
rrrra输出结果:
Yes
No
Yes
No//代码(DFS): #include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> using namespace std; int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; bool vis[22][22], flag; char map[22][22]; int n, m, sx, sy; inline void dfs(int x, int y, int num) {if(flag)return;for(int i = 0; i < 4; i ++){int tx = dir[i][0] + x;int ty = dir[i][1] + y;if(tx >= 0 && tx < n && ty >= 0 && ty < n && !vis[tx][ty]){// 如果是金刚,则不能走if(map[tx][ty] == 'k')continue;// 此时被咬第二口,死定了,所以不能走if(map[tx][ty] == 'd' && num >= 1)continue;// 如果是野狗,此时还没有被咬,则可以走,但是要被咬一口if(map[tx][ty] == 'd'){vis[tx][ty] = 1;dfs(tx, ty, num + 1);if(flag)return;vis[tx][ty] = 0;}if(map[tx][ty] == 'r'){vis[tx][ty] = 1;// 此时的num不需要加dfs(tx, ty, num);if(flag)return;vis[tx][ty] = 0;}// 找到了if(map[tx][ty] == 'a'){flag = 1;return;}}} }// 输入端 inline void Input() {// 注意初始化memset(map, 0, sizeof(map));memset(vis, 0, sizeof(vis));scanf("%d", &n);for(int i = 0; i < n; i ++){scanf("%s", map[i]);// 找出起点坐标,记录位置,对起点坐标预处理for(int j = 0; j < n; j ++)if(map[i][j] == 'p'){sx = i;sy = j;// 把起始点变成道路map[sx][sy] = 'r';}}// 预处理flag = 0;vis[sx][sy] = 1;// 第三个参数记录被狗咬到的次数dfs(sx, sy, 0); } // 输出端 inline void Output() {if(flag)printf("Yes\n");elseprintf("No\n"); } int main() {scanf("%d", &m);while(m --){Input();Output();}return 0; }
//代码(BFS): #include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <queue> using namespace std; int n, m, sx, sy, ex, ey; bool vis[22][22], flag; char map[22][22]; int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; struct data{int x; //x轴坐标int y; //y轴坐标int num; //记录被狗咬的次数 }st, pre; void BFS() {queue<data> que;st.x = sx;st.y = sy;st.num = 0;vis[sx][sy] = 1;//起点入队que.push(st);//不为空的时候进行循环while(!que.empty()){st = que.front();//读取第一个点que.pop(); //删除//找到终点坐标,输出Yes,终止BFSif(st.x == ex && st.y == ey){printf("Yes\n");flag = 1;return;}//四个方向遍历for(int i = 0;i < 4;i ++){int tx = st.x + dir[i][0];int ty = st.y + dir[i][1];//如果是金刚的话不可以走if(map[tx][ty] == 'k')continue;//如果是狗而且被咬了一次也不可以走,第二次就咬死了if(map[tx][ty] == 'd' && st.num == 1)continue;//已经走过,不可以走if(vis[tx][ty] == 1)continue;//判断是否越界if(tx < 0 || tx >= n || ty < 0 || ty >= n)continue;pre.x = tx;pre.y = ty;vis[tx][ty] = 1;//判断是否是狗,是的话num累加if(map[tx][ty] == 'd')pre.num = st.num + 1;//入队que.push(pre);}} }int main() {scanf("%d", &m);while(m --){memset(map, 0, sizeof(map));scanf("%d", &n);for(int i = 0;i < n;i ++){scanf("%s", map[i]);for(int j = 0;j < n;j ++)if(map[i][j] == 'p'){sx = i;sy = j;}else if(map[i][j] == 'd'){ex = i;ey = j;}}flag = 0;memset(vis, 0, sizeof(vis));BFS();if(!flag)printf("No\n");}return 0; }
求解解救amaze问题求解饥饿的小易问题相关推荐
- 饥饿的小易、另类加法
1.用命令方式运行以下代码的运行结果是(C) public class f{public static void main(String[] args){String foo1 = args[1];S ...
- 网易python笔试题_python 饥饿的小易(网易笔试题)
本周早些时候,学弟给我发了一道网易的笔试题,饥饿的小易,感觉有点意思-分享给大家 题目描述: 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前 ...
- 饥饿的小易(枚举+广度优先遍历(BFS))
题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使 ...
- 饥饿的小易(分枝限界法)
一. 程序题(共1题,100分) (程序题) 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x ...
- 剑指Offer——网易笔试之解救小易
知识要点 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走AC和 CB才能到达,由于街道很规则,ACB就像一个直角3 ...
- 2017年网易校招题 解救小易
题目描述 有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置).小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界).大反派超超想去捕捉可爱的小易,他手里有n个陷阱 ...
- java http get_「面小易-面经12」阿里巴巴Java方向面试题汇总(含答案)
简介: 从前几篇分享中能够看出,阿里不愧是"Java技术光明顶",无论是从Java方向的面经数量.质量,还是问题难度上来看,想要拿到阿里Java研发岗位的Offer,都需要面试者拥 ...
- 网易之小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性.需要根据给定的w,x,y,z,求出集合中一共有多少个元素。
import java.util.HashSet; import java.util.Scanner; import java.util.Set;/*** 小易最近在数学课上学习到了集合的概念,集合有 ...
- 【网易笔试】小易最近在数学课上学习到了集合的概念
/***************************************************** 小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性. ...
最新文章
- MSDN Visual系列:创建Feature扩展SharePoint列表项或文档的操作菜单项
- oracle中的 where 1=1 和where 11
- 圆形led屏幕_一种圆形LED显示屏幕的制作方法
- OpenReports中文支持方案
- 《狂人日记》金句摘抄(一)
- 揭秘ARouter路由机制,源码+原理+手写框架
- 90后中国程序员“黑吃黑”博彩网站,半年获利256万,判刑11年半
- RebatesMe:返利网站DDOS防护
- 日志单例log4cpp简述
- VS2008下用MFC 的MSComm控件编写串口程序
- 单手撸了个springboot+mybatis+druid 1
- 安装Visio 2016与原本的office冲突的最终解决方案
- 5.2探究执行器(Executors)
- 周报_2011第40周(2011/09/25-2011/10/01)
- 2021-09-02spark streaming
- “十四五”国家信息化规划发布,十大要点解读
- 计算机显示器工作原理与维修,VGA显卡工作原理及种故障维修方法
- .gitignore文件写法
- MMPlayer同步文件到手机应用中的方法
- Jetson Nano开发实录