博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
王道机试指南 P4 (搜索)
阅读量:3898 次
发布时间:2019-05-23

本文共 3137 字,大约阅读时间需要 10 分钟。

1.题目一:

在这里插入图片描述

#include
#include
#include
#include
#include
#include
#include
using namespace std;//白鸡问题,小于等于n元去买100只鸡,大鸡5元,小鸡 3元,还有1/3元的鸡 求x,y,z 并且以x增大为序列//想法一 处理这个排序问题的话,就需要用一个结构体数组,把x,y,z存入?然后再排序输出,然后使用一次暴力,然后三次循环struct M{ int x,y,z;}Num[100];bool cmp(M a,M b){ //先比较x,再x相同情况下,比较Y,最后是x if(a.x!=b.x) return a.x

问题二:BFS

这道题本身是不难的,套用bfs模板就行。可是就是因为自己的一点点小疏忽,把一个x错写成了y,导致找了半天的BUg,苦恼苦恼。。。(大伙们一定要仔细啊!!)
在这里插入图片描述

#include
#include
#include
#include
#include
#include
#include
using namespace std;//对于BFS来说,需要有队列的参与,每次都是进队,同理这道题的bfs的参数是三个坐标,但是会在队列中多一个时间的坐标,用来表示现在走了多久//每次进队列的时候,都是之前那个队列出来的时间加一//然后当然还需要一个三维数组来存xyz,和一个数组来判断有没有被访问过int map[50][50][50];bool make[50][50][50];//一个是用以输入,一个是用以判断int a,b,c,t;//表示的就是坐标位置//然后创建一个结构体用来存数据struct M{ int x,y,z,t;//分别代表三个坐标和时间};bool judge(int x,int y,int z){ //写一个判断是否可以选这个位置的函数 //把越界单独写出来吧 if(x<0||x>=a||y<0||y>=b||z<0||z>=c) return false; if(map[x][y][z]==0&&make[x][y][z]==false) return true;//如果这个地方是路,并且没有被访问过 return false;}//还要写三个数组用来(其实直接用一个二维数组就行)int stepx[6]={ 0,0,0,0,1,-1};int stepy[6]={ 0,0,1,-1,0,0};int stepz[6]={ 1,-1,0,0,0,0};int BFS(int x,int y,int z,int t){ //这里返回值是int 因为需要返回对应的时间 //首先让他进队吧,可是这个时间怎么算呢,那我的想法就是这里再加一个时间 //先创建一个队列 queue
q; M temp; temp.x=x; temp.y=y; temp.z=z; temp.t=t; //然后让这个temp进队列 q.push(temp); while(!q.empty()){ //在他非空的情况之下,然后删去队头 temp=q.front();//取出对头元素 //这里可以有一个判断 if(temp.x==a-1&&temp.y==b-1&&temp.z==c-1) return temp.t; q.pop(); // printf("%d%d%d ",temp.x,temp.y,temp.z); for(int i=0;i<6;i++){ //开始判断这几个位置 int newx=temp.x+stepx[i]; int newy=temp.y+stepy[i]; int newz=temp.z+stepz[i]; // printf("%d%d%d ",newx,newy,newz); if(judge(newx,newy,newz)){ //如果这个合理的话,那就,把他的t加一,并且加入队列,这里创建了一个新的结构体,用来加入队列,还要出示话 make[newx][newy][newz]=true; M gg; gg.x=newx; gg.y=newy; gg.z=newz;//找了半天,问题在这啊!! gg.t=temp.t+1;//这里是需要注意的 //然后入队 q.push(gg); } } } return -1;}int main(){ int k,time; scanf("%d",&k); while(k--){ scanf("%d%d%d%d",&a,&b,&c,&time); //开始初始化 for(int i=0;i

问题四:递归

在这里插入图片描述
这题有写过,在hdu100上面

问题五

素数环问题
在这里插入图片描述
在这里插入图片描述

题目大致意思:

在这里插入图片描述
这是一道好题,还是在看了解析之后写出来的,

#include
#include
#include
#include
#include
#include
#include
using namespace std;//素数环,大致思路就是:从1出发 然后输入一个值,判断这个值能不能和第一个值相加之后,仍然是素数,如果是的话,那就开始判断下一个//如果不可以的话,那就回退到前一个//需要创建一个数组来存当前的输入值,还有一个Bool型数组来判断当前这个可不可以用int n;int res[30];bool has[30];//再写一个方法判断这个数是不是素数bool is_su(int x){ if(x<=1) return false; for(int i=2;i
1) if(!is_su(res[num]+res[num-1])) return ;//直接先判断这个可不可行 if(num==n){ //到了最后一个 check(); return ; } //其他情况开始 for(int i=2;i<=n;i++){ if(has[i]==false){ //如果这个点没有被访问过,那就先把他变成访问 has[i]=true; res[num+1]=i;//这里是+1 不代表num变成了num+1 DFS(num+1); //开始遍历,遍历完了之后,在把这个位置设置为可以访问 has[i]=false; } }}int main(){ int cas=0;//这个就是输出的时候那个case while(scanf("%d",&n)!=EOF){ //输入这个N cas++;//每次都加一 //初始化bool memset(has,false,sizeof(has)); //然后开始判断,把第一个当做访问过了 res[1]=1; has[1]=true; printf("Case %d\n",cas); DFS(1); }}

下一题

在这里插入图片描述
题目大致意思:
在这里插入图片描述
其实就是求连通图的问题,可以用BFS和DFS,而用DFS比较适合,方法就是,在一个数组里,通过一次DFS,把它连通的@全都变成* 然后进行递归,找到剩余的@ 然后继续遍历

转载地址:http://dyfen.baihongyu.com/

你可能感兴趣的文章
swift 3.0 数组赋值
查看>>
用C#通过888-TT打印中文标签
查看>>
sendmail 出现 My unqualified host name的解决办法
查看>>
彻底解决lazarus安装组件后烦人的编译时单元找不到的问题!
查看>>
Delphi的参数修饰const/var/output 与C++的对应关系
查看>>
C++ free与delete区别
查看>>
VC的字符串转换atlconv的使用
查看>>
Twitter的分布式自增ID算法snowflake (Java版)
查看>>
阻抗测量基础
查看>>
天线设计相关性能参数
查看>>
Linux Centos7 rabbitmq安装及集群配置
查看>>
CentOS7 安装配置FastDFS
查看>>
git 拉取gitlab 代码
查看>>
递归算法的时间复杂度
查看>>
数据结构之图(存储结构、遍历)
查看>>
使用sizeof计算类的大小
查看>>
乐观锁与悲观锁——解决并发问题
查看>>
operator 类型转换及重载
查看>>
HTTP状态码
查看>>
TCP/IP详解--举例明白发送/接收缓冲区、滑动窗口协议之间的关系
查看>>