有吃的!

article/2025/5/15 5:35:33

问题描述


      妇添小有一个很厉害的技能:发现吃的!如果有好吃的东西,不论多远,只要一闻就能知道在哪里。这天他刚刚在程设rejudge完,忽然鼻子一抽——有吃的!他决定马上赶去吃这么好吃的东西。

      语文男为了考验妇添小的品味,在路中间放了很多馒头,看他会不会饿的先吃馒头。妇添小当然不会让这种雕虫小计得逞!为了保持自己的品味,他决定绕开所有的馒头。Eureka受到妇添小邀请,运用绝世法力构造了很多传送点,任意两个传送点之间都能瞬移(当然传不传,传到哪里都可以随心所欲)。妇添小每次移动只能走上下左右四个方向(瞬移除外,并且瞬移不耗费时间)。现在,妇添小最短多长时间能吃到好吃的东西呢?

(当然,为了出题我们隐瞒了一些事实:不仅好吃的不见了,路上的馒头竟然也不翼而飞了,这真真是个悲伤的故事T.T)

输入:

第一行包含两个数字n,m(1<=n,m<=2000)

接下来包含n行,每行m个字符,表示现在的地图。'.'表示空地,'M‘表示馒头,‘E’表示传送点,'N'表示妇添小所在的位置,'C'表示吃的。'N'和‘C'在地图中出现且仅出现一次。

输出:

一个数字,表示妇添小最快能多长时间吃到好吃的。如果永远吃不到,只能说明传送点不够多,输出“Bad Eureka”。

提示:如果时间显示是0.004等很短的时间,但是最后评测为TLE,这时候实际上是因为开的数组过大,超出了内存限制。


测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 6 6↵
  2. ...E..↵
  3. EMM.M.↵
  4. .M..M.↵
  5. .MC.M.↵
  6. .MMM..↵
  7. N..E..↵
以文本方式显示
  1. 7↵
1秒 64M 0
题解思路

大致思路:

一种思路就是利用广度优先搜索,进行三次搜索,N到E的距离S1,C到E的距离S2,N到C的距离S3,进行搜索,如果可以到的话就比较S3和S1+S2的大小,去较小的一个。

另一种思路就是运用动态规划,从结束的那个点开始向前搜索,每一次都只走该位置上下左右中步数较少的那一个。

具体实现:

第一种思路就是自己用数组模拟一个队列,然后对数组进行操作,可以走就加入队列,并把他的父亲节点去掉,不可以走就不加入队列。

第二种思路就是设置一个状态数组记录每个位置所要走的步数,递归即可。

注意:

(1)由于数据量比较大,所以开数组的时候要尽量的使用恰当的数据类型,比如记录每个点的信息,就用char型的;记录每个点是否走过可以用char型的或是short型的(short型和int型的是不一样的):记录每个点的坐标也可以用short型的,这样就可以节省好多空间。队列也可以循环利用。

(2)记录信息的时候看自己是从0位开始的还是从1位开始的,在搜索的时候注意一下边界,防止越界。


实现代码


<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#include<string.h>int m,n;
char map[2004][2004];
struct queues
{short heng;short zong;int ceng;
}que[4000005];
int dheng[4]={1,0,-1,0};
int dzong[4]={0,1,0,-1};
int BFS1(int x,int y)
{int start=0;int last=1;int k,tempi,tempj; short visit[2004][2004];  int t1,t2;t1=x;t2=y;                            //找E memset(visit,0,sizeof(visit));visit[t1][t2]=1;que[0].heng=t1;que[0].zong=t2;que[0].ceng=0;while(start<last){if(map[que[start].heng][que[start].zong]=='E')return que[start].ceng;for(k=0;k<4;k++){tempi=que[start].heng+dheng[k];tempj=que[start].zong+dzong[k];if(tempi<0||tempi>m-1||tempj<0||tempj>n-1){continue;}if(map[tempi][tempj]!='M'&&!visit[tempi][tempj]){visit[tempi][tempj]=1;que[last].heng=tempi;que[last].zong=tempj;que[last].ceng=que[start].ceng+1;last++;}}start++;}return -1;	
}
int BFS2(int x,int y)
{int start=0;int last=1;int k,tempi,tempj;short visit[2004][2004]; int t1,t2;t1=x;t2=y;                             memset(visit,0,sizeof(visit));visit[t1][t2]=1;que[0].heng=t1;que[0].zong=t2;que[0].ceng=0;while(start<last){if(map[que[start].heng][que[start].zong]=='C')return que[start].ceng;for(k=0;k<4;k++){tempi=que[start].heng+dheng[k];tempj=que[start].zong+dzong[k];if(tempi<0||tempi>m-1||tempj<0||tempj>n-1){continue;}if(map[tempi][tempj]!='M'&&!visit[tempi][tempj]){visit[tempi][tempj]=1;que[last].heng=tempi;que[last].zong=tempj;que[last++].ceng=que[start].ceng+1;}}start++;}return -1;		
}
int main()
{short i,j;short x1,y1,x2,y2;int count1,count2,count3,count;scanf("%d%d",&m,&n);getchar(); for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%c",&map[i][j]);if(map[i][j]=='N'){x1=i;y1=j;}if(map[i][j]=='C'){x2=i;y2=j;}}getchar();}int flag=0;count1=BFS1(x1,y1);count2=BFS1(x2,y2);count3=BFS2(x1,y1);if(count1!=-1&&count2!=-1){if(count3==-1){count=count1+count2;	}else{if(count3<count1+count2){count=count3;}else{count=count1+count2;}}	}else{if(count3==-1){flag=1;}else{count=count3;}}if(flag==1){printf("Bad Eureka\n");}else{printf("%d\n",count);}return 0;}</span>



http://chatgpt.dhexx.cn/article/eqLkcO56.shtml

相关文章

今天中午吃什么转盘html,吃到撑的几种简单午饭,让你再也不发愁吃什么了!...

大家好这里是树新游四方,今天给大家介绍几款午饭美食! 家里做的饭菜,总是那么乏味,想吃点新鲜的,又不会做,于是来来回回就那么几种菜式,早就吃烦了,今天给大家推出几种简单的菜饭,让你再也不发愁吃什么了。 第一道:蛋包饭 第一次了解这个美食,还是看电视中学到的,自…

如何“吃”掉一本书

不知道小时候你有没有干过这样一件事&#xff0c;用一把剪刀把报纸或杂志上看到的“一片”美好的词汇剪下来&#xff0c;然后贴到一个笔记本里面&#xff0c;这样一年下来&#xff0c;就有厚厚的一本笔记。 后来的你是不是逐渐丧失了这种“技能”了呢&#xff0c;但李敖却一直使…

帧数达不到144用144hz_怎么能一直吃鸡一直爽?144fps+144Hz告诉你结果“帧”香!...

原标题&#xff1a;怎么能一直吃鸡一直爽&#xff1f;144fps144Hz告诉你结果“帧”香&#xff01; 在过去的几年中&#xff0c;“大逃杀”类型的游戏可以说是风靡全球&#xff0c;引来了无数玩家的热捧。像《绝地求生&#xff1a;大逃杀》、《APEX英雄》、《堡垒之夜》&#xf…

《二吃一》游戏加蓝牙代码

转载自&#xff1a;http://www.aisidachina.com/forum/thread-105-1-2.html 二吃一又名四步顶或是四棋&#xff0c;起源于中国民间。规则是两块吃一块&#xff0c;就是在一条直线上的自己的两个棋子可以吃掉对方的一个棋子。在这说一下这个游戏的主要思想和大家分享一下&#…

今天出去吃了一下午小吃~

转载于:https://www.cnblogs.com/keaideweiwei/archive/2012/12/07/2807834.html

吃一吃

1.给/dev/sdb2分区创建文件系统&#xff0c;类型为ext3mkfs -t ext3 /dev/sdb22.列出磁盘分区信息fdisk -l3.找到根目录下用户为root&#xff0c;权限为644的文件&#xff0c;修改权限为其他用户没有权限find / -user root -a -prem 644 -exec chomd 640 {} \;4./etc/passwd文件…

CSS行高的测量

一般默认的字体大小为16px行高是相邻行“基线”之间的距离&#xff0c;是包含行间距的 使用line-height设置行高时&#xff0c;除去字体大小剩下的距离会在行的上边和下边平分&#xff0c;即&#xff1a;行高字体大小上边距下边距&#xff08;同时上边距等于下边距&#xff09;…

css 行高解析

line-height:1.5; //行高不设置单位时&#xff0c;为当前元素字体大小*1.5不是文字撑开了div的高度&#xff0c;而是line-height .test1{font-size:20px; line-height:0; border:1px solid #cccccc; background:#eeeeee;} .test2{font-size:0; line-height:20px; border:1px s…

css设置1.5倍行高,css设定行高、绝对定位

设定行高2种方式 使用width、height(假定现宽38,高22 &#xff1b;目标宽70&#xff0c;高30) .welcome{ width: 70px; height: 30px; line-height: 30px; text-align: center; } 使用padding .welcome{ padding: 4px 16px; line-height: 22px; } 补充&#xff1a; 使用width、…

CSS 行高 line-height属性

在CSS中&#xff0c;通过 line-height属性来定义行高&#xff0c;行高是指相邻两行文本基线之间的垂直距离。 那什么是基线呢&#xff1f;对任何一个行内非替换元素&#xff0c;其内容区都会存在四条假想的线&#xff0c;分别是底线&#xff08;bottom&#xff09;、基线&…

P53-前端基础CSS-行高设置

P53-前端基础CSS-行高设置 1.概述 行高&#xff08;line height&#xff09; 行高指的是文字占有的实际高度可以通过line-height来设置行高 行高可以直接指定一个大小&#xff08;px em&#xff09;也可以直接为行高设置一个整数如果是一个整数的话&#xff0c;行高将会是字体…

CSS行高背景

一.行高 1.定义&#xff1a; 行高上距离内容高度下距离 其中 上距离下距离 2.应用场景 让单行文本在盒子中垂直居中对齐。在浏览器中行高是跟随字体大小变化的。 所以我们让文字的行高等于盒子的高度。 div{ height:50px; line-height:50px; } 3.行高与盒子高度的三种关系 如…

css控制文本的行高

line-height可以控制文本的行高 示例 <p> 这是一个标准行高的段落。 在大多数浏览器默认行高约20 px。 这是一个标准行高的段落。 这是一个标准行高的段落。 </p> <p class"p1"> 这是一个更小行高的段落。 这是一个更小行高的段落。 这是一个更小…

CSS行高line-height属性理解及应用

行高的概念看上去很简单——文字行的高度&#xff0c;其实&#xff0c;行高所涉及到的基础知识&#xff0c;对于今后理解其它属性也很重要。 大片密密麻麻的文字往往会让人觉得乏味&#xff0c;因此适当地调整行高&#xff08;line-height&#xff09;可以减低阅读的困难与枯…

css行高和盒子高区别

行高 什么是行高 在css中所有的行都有自己的行高。 .box1 {border: 1px solid black;width: 200px; }<div class"box1">我是文字</div>被撑起来的高度就是行高 line-height属性 line-height: 60px;80px就是行高 注意点&#xff1a; 1.行高和盒子的…

css 行高

1. 什么是行高&#xff0c;以及行高的概念 我们可以试想一下&#xff0c;为什么会要有行高。我现在不需要行高不是完全可以的嘛。 我们可以仔细看看这个&#xff0c;这不是很正常的嘛。 那我们来看看这个&#xff0c;那当我们第一次看到这个的时候你觉得是横着度&#xff0c;…

css行高(line-height)及文本垂直居中原理

css行高&#xff08;line-height&#xff09;及文本垂直居中原理 一、行高的定义 标准定义&#xff1a;两行文字基线之间的距离。 那么什么是基线&#xff1f; 基线是在英文字母中用到的一个概念&#xff0c;我们刚学英语的时使用的那个英语本子每行有四条线。在 CSS 中&am…

css设置1.5倍行高,CSS怎么控制行高?

CSS怎么控制行高&#xff1f; css中&#xff0c;调整每行文字字体间距(行距)是使用line-height属性。 ● line-height 属性设置行间的距离(行高)。 注&#xff1a;不允许使用负值。 要实现上下换行文字行间距行高样式其实我们只用对文字所在对象设置line-height样式即可&#x…

css字行高怎么设,css文本行高怎么设置-电脑自学网

css文本行高的设置方法&#xff1a;首先新建文件&#xff0c;使用div标签创建一行文字&#xff1b;然后编写样式&#xff0c;设置div标签的class属性为mybkkd&#xff1b;最后通过div标签的class属性mybkkd设置文字上下的行高。 本教程操作环境&#xff1a;windows7系统、css3版…

CSS行高(line-height)使文本垂直居中详解

一.场景重现 在我们的静态页面设计中&#xff0c;在我们的块级元素中写入文字时&#xff1a; <div class"center">我想在中间</div> .center{height: 50px;background-color: #008c8c;} 会发现我们最后在网页显示的效果为&#xff1a; 这明显不太美观…