zoukankan      html  css  js  c++  java
  • NOI-2971 抓住那头牛题解

    题目传送门

    第一次用(bfs),卡了我好几天(没错,你没有听错),才发现自己想象中的(bfs)与真实的(bfs)的差别

    (bfs)是一层一层的,将每一层都入队,所以最外面的(while)循环判断条件是队列非空

    每一个节点都可以作为父节点在队列后加几种可能性去搜索

    需要判重

    判重数组可以与存储答案的数组合并

    最后输出(f_m)

    #include<iostream>
    #include<queue>
    #include<cstring>
    using namespace std;
    queue<int> a;//队列
    int flag[205005];//判重
    int main()
    {
    	memset(flag,-1,sizeof(flag));//初始化
    	int n,m;
    	cin>>n>>m;
    	if(n==m)//相等的情况
       {
    		cout<<0;
    		return 0;
    	}
    	a.push(n);//压入初始点
    	flag[n]=0;//第0步
    	while(!a.empty())//非空
    	{
    		int temp=a.front();//取出队首
    		a.pop();
    		if(temp==m)
    			break;//到达即推出
    		if(temp*2<200005&&flag[temp*2]==-1)
    			a.push(temp*2),flag[temp*2]=flag[temp]+1;//判断边界与判断重复
    		if(temp+1<=m&&flag[temp+1]==-1)//一个剪枝与判断重复
    			a.push(temp+1),flag[temp+1]=flag[temp]+1;
    		if(temp-1>=0&&flag[temp-1]==-1)//边界与重复
    			a.push(temp-1),flag[temp-1]=flag[temp]+1;
    	}
    	cout<<flag[m];//输出答案
    	return 0;
    }
    

    注:此乃笔记

    我要拿金牌!
  • 相关阅读:
    hdu 4496 D-City 并查集
    hdu 4493 Tutor 水题
    codeforces 377A. Puzzles 水题
    hdu 1257 小希的迷宫 并查集
    图论500题
    cdoj 93 King's Sanctuary 傻逼几何题
    cdoj 题目简单分类
    cdoj 80 Cube 水题
    cdoj 71 I am Lord Voldemort 水题
    cdoj 65 CD Making 水题
  • 原文地址:https://www.cnblogs.com/jerrywang-blogs/p/14900445.html
Copyright © 2011-2022 走看看