求解饥饿的小易问题

题目描述

小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置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

输出

1

2、主要思想:

(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. 饥饿的小易、另类加法

    1.用命令方式运行以下代码的运行结果是(C) public class f{public static void main(String[] args){String foo1 = args[1];S ...

  2. 网易python笔试题_python 饥饿的小易(网易笔试题)

    本周早些时候,学弟给我发了一道网易的笔试题,饥饿的小易,感觉有点意思-分享给大家 题目描述: 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前 ...

  3. 饥饿的小易(枚举+广度优先遍历(BFS))

    题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使 ...

  4. 饥饿的小易(分枝限界法)

    一. 程序题(共1题,100分) (程序题) 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x ...

  5. 剑指Offer——网易笔试之解救小易

    知识要点 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走AC和 CB才能到达,由于街道很规则,ACB就像一个直角3 ...

  6. 2017年网易校招题 解救小易

    题目描述 有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置).小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界).大反派超超想去捕捉可爱的小易,他手里有n个陷阱 ...

  7. java http get_「面小易-面经12」阿里巴巴Java方向面试题汇总(含答案)

    简介: 从前几篇分享中能够看出,阿里不愧是"Java技术光明顶",无论是从Java方向的面经数量.质量,还是问题难度上来看,想要拿到阿里Java研发岗位的Offer,都需要面试者拥 ...

  8. 网易之小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性.需要根据给定的w,x,y,z,求出集合中一共有多少个元素。

    import java.util.HashSet; import java.util.Scanner; import java.util.Set;/*** 小易最近在数学课上学习到了集合的概念,集合有 ...

  9. 【网易笔试】小易最近在数学课上学习到了集合的概念

    /***************************************************** 小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性. ...

最新文章

  1. GPS计算司机行车时长,深圳交警开启疲劳驾驶午间整治
  2. 机器学习安然数据集分析报告
  3. Redis缓存与数据库双写一致性
  4. CAN笔记(11) 位时序
  5. hash function/ hash table 背后的数学基础
  6. 项目管理第十一章项目风险管理
  7. pdf拆分成一页一页
  8. Python基于django的图书商城管理系统毕业设计源码110938
  9. tf1.x error:Variable generator/encoder_image/conv2d/kernel already exists, disallowed
  10. 怎样利用python做一个软件,python可以自己做软件吗
  11. How to Install Nvidia Kernel Module Cuda and Pyrit in Kali Linux
  12. 从 sketch 中获取颜色、字体组件内容
  13. 数据传输功能单元——DID参数定义
  14. 遥感免费数据四维度汇总
  15. xp无法ping工作组计算机,在XP下Ping不通win2003怎么解决?
  16. Java 中 Pair 类的五种替代方案
  17. 申通快递机器人上岗_申通快递机器人上岗 物流机器人在中国会是个大生意
  18. 网红蛋糕店被关闭,我看到了一个暴利的赚钱项目
  19. Hi35XXX海思媒体处理平台架构介绍.
  20. 教你用PQMagic魔法师调整硬盘分区大小【图解教程】

热门文章

  1. linux网卡抓包命令,基于Linux Socket实现的网卡抓包程序
  2. 从变现到用户的肉搏之后,抖音快手海外之战也将愈演愈烈?
  3. 【转】终于搞明白什么叫双卡双待双模双通手机
  4. Python之父,26岁大学毕业,35岁发明Python,却差点因为沉迷编程被退学
  5. upload-labs 21超详细通关笔记+部分代码审计(条件竞争等)
  6. python-田字格输出
  7. always @(*) 中‘*’所代表的意思
  8. 一个系列涨粉47w,小红书内容创意卷出新高度
  9. pdf 模版 汉字和数字_写好汉字和数字,这是最标准的格式!(强烈推荐收藏)...
  10. 童话镇计算机乐谱,天谕手游乐谱童话镇代码