关于几个容器类函数:https://blog.csdn.net/tju_fengbo/article/details/81978595
<队列>queue:https://www.cnblogs.com/xuning/p/3321733.html
https://blog.csdn.net/chao_xun/article/details/8037438
https://blog.csdn.net/fengzhizi76506/article/details/54809949/
题目描述
大概:求把一个数减到0的最小步数
小z新买了一辆遥控车,这个遥控车的遥控器上的按键按一次可以
1.前进或后退1m
2.前进或后退7m
3.前进或后退10m
现在他想跑x米,x>0,代表前进x米,x=0,代表原地不动,x<0,代表后退x米。小z想知道他的最小操作数。
http://www.tzcoder.cn/acmhome/problemdetail.do?method=showdetail&id=6469
样例
样例输入
3
8
0
-7样例输出
2
0
1
//思路1:把该数所有偏移量遍历一遍,步数加一次
把该数+偏移量得到的数字存在qu容器里面
对该容器的数字进行下一次的遍历,直到零为止
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int dx[]={-1,1,-7,7,-10,10};
map<int,bool>mp;///标记
int BFS(int x) {
queue<pair<int,int> >qu;///pair也可以换成结构体
qu.push({x,0});///初始化操作值 和 操作次数
mp.clear();///map放全局使用前记得清空
while(qu.size()){
x = qu.front().first;
int step = qu.front().second;
qu.pop();
if(x==0) return step;
step++;
for(int i = 0;i < 6;i++) {
int now = x+dx[i];//7 9 1 15 -2 18
if(!mp[now]) {
mp[now] = true;
qu.push({now,step});
}
}
}
}
int main() {
int T;
cin>>T;
int x;
while(T--) {
cin>>x;
cout<<BFS(x)<<endl;
}
}
//思路2:最小值问题:宽度优先搜索(BFS)
这题正解为BFS,因为广搜的时候可以保证步数最少,直接搜到x就可以了
为什么数组要加上150(小z想跑的距离(-100<=x<=100)。)
有负数防止越界
#include <bits/stdc++.h>
using namespace std;
int dir[6]={1,-1,7,-7,10,-10};
int s, e;
int visited[300], step[300];
int BFS()
{
queue<int> qu;
qu.push(s);
visited[150+s] = 1;//起始位置被标记
step[150+s] = 0; //开始时步数为0
while(!qu.empty())
{
int cur = qu.front();
qu.pop();
if(cur==e)
return step[150+cur];
for(int i=0;i<6;i++)
{
int nxt = cur+dir[i];//1 -1 7 -7 10 -10 //(想想树状图:由第一个0产生了这六种可能,把它们存在qu,再往下遍历)
if(abs(nxt)<=120 && visited[150+nxt]==0)//2 0 8 -6 11 -9
{
visited[150+nxt] = 1;
step[150+nxt] = step[150+cur]+1;
qu.push(nxt);
}
}
}
}
int main()
{
int cas;
cin>>cas;
while(cas--)
{
memset(visited, 0, sizeof(visited));
memset(step, 0, sizeof(step));
s = 0;
cin>>e;
cout<<BFS()<<endl;
}
return 0;
}
//关于队列queue相关知识点
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int e,n,m;
queue< int > q1;//构建
for ( int i=0;i<10;i++)
q1.push(i);//在末尾加上元素
if (!q1.empty())//判断是否为空
cout<< "dui lie bu kong\n" ;
n=q1.size();//返回队列queue的长度 10
cout<<n<<endl;
m=q1.back();//返回末尾数字 9
cout<<m<<endl;
for ( int j=0;j<n;j++)
{
e=q1.front();
cout<<e<< " " ;//0 1 2 3 4 5 6 7 8 9
q1.pop();//读完一个数就删除掉(删除第一个数)
}
cout<<endl;
if (q1.empty())
cout<< "dui lie bu kong\n" ;
system ( "PAUSE" );
return 0;
}
关于BFS
https://www.cnblogs.com/s-k-p/p/13598668.html
//1、把起始点放入queue;
2、重复下述2步骤,直到queue为空为止:
1) 从queue中取出队列头的点;
2) 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入queue中。