玉米迷宫:- [P1825 [USACO11OPEN]Corn Maze S](https://www.luogu.com.cn/problem/P1825)

这是让我卡了整整一天的题目,虽然说思路不难,与普通迷宫类似,但是有些坑值得注意!

1.传送器不一定只用一次,有可能只是一个中转点,如下图:

你得走到传送门,传送到另一端,再在另一端随便走一步再回来,所以我们在标记时不能标记传送门的两端。

2.在走到传送门时,你需要遍历这个地图寻找对应的传送门,但请记住要避开原传送门坐标,只要x,y不全相等就可以了。!!!我当时一直认为x,y都得不相等,真被自己给蠢到了。

bfs解题代码如下:

#include<stdio.h>
int n,m,startx,starty,endx,endy,dx,dy;
char map[310][310];
int book[310][310];
struct point
{int x;int y;int step;
};
void check(int *x,int *y)//寻找对应传送门
{for(int i=1; i<=n; i++){for(int j=0; j<m; j++){if(map[i][j]==map[*x][*y]&&(i!=*x||j!=*y))//x,y不全相等!!!{*x=i;*y=j;return;}}}
}
struct point queue[90010];
int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
int main()
{scanf("%d%d",&n,&m);for(int i=1; i<=n; i++)scanf("%s",map[i]);for(int i=1; i<=n; i++){for(int j=0; j<m; j++){if(map[i][j]=='@'){startx=i;starty=j;}if(map[i][j]=='='){endx=i;endy=j;}}}int head=1,tail=1;queue[tail].x=startx;queue[tail].y=starty;queue[tail].step=0;tail++;book[startx][starty]=1;while(head<tail){if(queue[head].x==endx&&queue[head].y==endy){printf("%d",queue[head].step);break;}for(int i=0; i<4; i++){dx=queue[head].x+next[i][0];dy=queue[head].y+next[i][1];if(dx<1||dx>n||dy<0||dy>m-1||book[dx][dy]==1||map[dx][dy]=='#')continue;if(map[dx][dy]>=65&&map[dx][dy]<=90)check(&dx,&dy);//传送queue[tail].x=dx;queue[tail].y=dy;queue[tail].step=queue[head].step+1;tail++;book[dx][dy]=1;if(map[dx][dy]>=65&&map[dx][dy]<=90)book[dx][dy]=0;//不能标记传送点的两端}head++;}return 0;
}

Meteor Shower:

- [P2895 [USACO08FEB]Meteor Shower S](https://www.luogu.com.cn/problem/P2895)

该题需要特别注意定义一个二维数组来记录流星坠落到每个格子的最早时间,如果该格子没有流星坠落则记为-1. 除此之外走过的格子当然也需要标记。其他的就是正常的迷宫做法。

bfs解题代码如下:

#include<stdio.h>
#include<string.h>
struct point
{int x;int y;int time;
};
int droptime[310][310],book[310][310];
struct point queue[90100];
int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
int main()
{memset(droptime,-1,sizeof(droptime));//先全部记为不会坠落int m=0,xi=0,yi=0,ti=0;scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d%d",&xi,&yi,&ti);if(ti<droptime[xi][yi]||droptime[xi][yi]==-1)droptime[xi][yi]=ti;for(int j=0;j<4;j++)//记录坠落点上下左右四个格子的最早坠落时间{int dx=xi+next[j][0];int dy=yi+next[j][1];if(dx>=0&&dy>=0&&(droptime[dx][dy]>ti||droptime[dx][dy]==-1))droptime[dx][dy]=ti;//取最早坠落时间}}int head=1,tail=1;queue[tail].x=0;queue[tail].y=0;queue[tail].time=0;book[0][0]=1;tail++;while(head<tail){int x=queue[head].x;int y=queue[head].y;if(droptime[x][y]==-1){printf("%d",queue[head].time);break;}for(int i=0;i<4;i++){int dx=x+next[i][0];int dy=y+next[i][1];if(dx>=0&&dy>=0&&(droptime[dx][dy]>queue[head].time+1||droptime[dx][dy]==-1)&&book[dx][dy]==0){book[dx][dy]=1;queue[tail].x=dx;queue[tail].y=dy;queue[tail].time=queue[head].time+1;tail++;}}head++;}return 0;
}

单词接龙:- [P1019 [NOIP2000 提高组] 单词接龙](https://www.luogu.com.cn/problem/P1019)

需要注意的是这题每个单词可以最多出现两次,用个数组记录即可,接龙时可以有重合部分但不能存在包含关系,不然接了和没接是一样的。这题适合用dfs解。求重合部分可以从已经在龙里的最后一个单词(记为a)的最后面开始枚举(从后向前枚举)直到找到a单词的一个字母和想要接龙的单词(记为b)的第一个字母相等,把a单词中匹配到的相等字母的位置记录为j,然后a单词从j+1到尾进行循环枚举,同时b单词从头到后进行枚举,如果有不相等的一个字母就返回0,否则返回b的长度 -(k + 1).

代码实现如下:

#include<stdio.h>
#include<string.h>
char word[100][100];
int book[100],l[100];
int n,ans,max,p;
char start;
int check(int x,int y)//判断单词x,与单词y是否可接
{int lx=l[x];int ly=l[y];for(int i=lx-1;i>=0;i--){if(word[x][i]==word[y][0]){int k=0;for(int j=i+1;j<=lx-1;j++){k++;if(word[x][j]!=word[y][k])return 0;}return ly-k-1;}}return 0;
}
void dfs(int x)//x为龙尾,搜索可以接的单词
{if(ans>p)p=ans;for(int i=1;i<=n;i++){if(book[i]<2&&check(x,i)){book[i]++;ans+=check(x,i);dfs(i);//回溯处理book[i]--;ans-=check(x,i);}}
}
int main()
{scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%s",word[i]);l[i]=strlen(word[i]);}scanf(" %c",&start);for(int i=1; i<=n; i++){if(word[i][0]==start){ans+=l[i];book[i]++;dfs(i);//回溯处理book[i]--;ans-=l[i];if(max<p)max=p;}}printf("%d",max);return 0;
}

洛谷有毒!!!我用

 getchar();scanf("%c",&start);

不给过!要想过只能用

scanf(" %c",&start);

玉米迷宫,Meteor Shower S,单词接龙相关推荐

  1. bfs总结 bfs题单 最短路 python (奇怪的电梯 好奇怪的游戏 迷宫 马的遍历 [USACO08FEB]Meteor Shower S)

    1 可以用来遍历所有的点 2 可以用来找最短路 3 多源最短路,开始时一次向队列放之多个点#板子 """ def bfs():1 起始点入队标记入队的点while not ...

  2. 【每日一算法】单词接龙

    微信改版,加星标不迷路! 每日一算法-单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规 ...

  3. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  4. 洛谷 P1019 单词接龙 (DFS)

    题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...

  5. 算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs

    题目分析 来源:acwing 分析:外部dfs,需要状态恢复. 字符串a的后k的字母 和字符串b的前k个字母是否相同,用substr函数判断:if(a.substr(a.size() - k, k) ...

  6. bzoj3299 [USACO2011 Open]Corn Maze玉米迷宫

    Description 今年秋天,约翰带着奶牛们去玩玉米迷宫.迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行.  迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是 ...

  7. P1019 单词接龙 (DFS)

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  8. 洛谷——P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  9. 洛谷 P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

最新文章

  1. “你行你上”:有本事跟OpenAI Five打一把DOTA?| 极客头条
  2. 别再搞错!OAuth 2.0只是授权协议,OIDC才是认证授权协议
  3. java中后端拼接字符串返回前台页面换行显示
  4. Java工程转换为Maven工程-b
  5. 逻辑表达式——黑纸白纸
  6. Waymo捷豹合推电动无人车I-PACE,将加入无人出租车队
  7. 用“归并”改进“快速排序”
  8. struts2的json插件配置详解
  9. OpenWrt 防火墙组件
  10. mysql网上图书销售_PHP+MySQL网上书店|网上图书销售系统
  11. 简单说明什么是网络的DMZ区域
  12. 摩尔定律,贝尔定律,吉尔德定律,麦特卡尔夫定律
  13. 述职答辩提问环节一般可以问些什么_01、述职答辩操作流程指引
  14. 自下而上构建知识图谱全过程
  15. 275. H指数 II
  16. 装系统需不需要格式化系统盘?别再被这些说法骗了!
  17. 游戏角色/3D电影逼真写实角色是如何制作出来的?
  18. 20个面向前端开发人员的文档和指南(第4号)
  19. 频谱仪的更改ip_【正点原子FPGA连载】第五十一章 基于FFT IP核的音频频谱仪-摘自【正点原子】开拓者 FPGA 开发指南 (amobbs.com 阿莫电子论坛)...
  20. 全国计算机技术与软件专业技术考试----(中级资格/工程师)各资格证详细介绍

热门文章

  1. Excel报表的导出
  2. 学生用计算机的功能,怎么使用学生专用计算器? 来看看吧
  3. CentOS Frp内网穿透:Frps+Nginx反向代理
  4. 通信使用matlab三元码实验报告,Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验...
  5. php用户登录论坛系统,PHPWind
  6. 初学者学习JAVASCRIPT很吃力怎么办?到底该如何学习JS?
  7. 如何恢复计算机我的电脑工具栏,电脑任务栏怎么还原 电脑任务栏的还原方法...
  8. vue element ui合并表格(合并某列的行数据)
  9. html页面如何访问控制限制,网页访问控制
  10. 计算机网络 - 概述