标签:pop std def include mem nod algorithm color 一个
题目链接http://noi.openjudge.cn/ch0205/2971/
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
5 17
4
查看
我用DFS无论怎么优化都超时,用BFS轻松就过了。这题比较适合用BFS,而且实现也比较容易。跟dfs一样,这里不需要显示的建图,每个状态看成一个节点,状态的转移看成边,状态的转移有三种方法,所以每个节点只有三条边,是确定的。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<queue> #define DEBUG(x) cout<<#x<<" = "<<x<<endl const int MAXN=1e5+10; using namespace std; struct Node{ int pos;///农夫的位置 int steps; Node(){} Node(int xx,int s):pos(xx),steps(s){} }; queue<Node>q; int visited[MAXN]; int main() { // freopen("in.txt","r",stdin); int N,K; cin>>N>>K; memset(visited,0,sizeof(visited)); q.push(Node(N,0)); visited[N]=true; while(!q.empty()){ Node t=q.front(); q.pop(); if(t.pos==K){ cout<<t.steps<<endl; return 0; } if(t.pos-1>=0&&!visited[t.pos-1]){ q.push(Node(t.pos-1,t.steps+1)); visited[t.pos-1]=true; } if(t.pos+1<=MAXN&&!visited[t.pos+1]){ q.push(Node(t.pos+1,t.steps+1)); visited[t.pos+1]=true; } if(t.pos*2<=MAXN&&!visited[t.pos*2]){ q.push(Node(t.pos*2,t.steps+1)); visited[t.pos*2]=true; } } }
标签:pop std def include mem nod algorithm color 一个
原文地址:https://www.cnblogs.com/MalcolmMeng/p/9268462.html