"題目鏈接" 題解: 這個題可以用廣搜來解決,從農夫到牛的走法每次都有三種選擇,定義一個隊列,把農夫的節點加進隊列,然後以這三種走法找牛,隊列先進先出,按順序直到找到牛的位置。 代碼: c++ include include include include using namespace std; ...
題目鏈接
題解:
這個題可以用廣搜來解決,從農夫到牛的走法每次都有三種選擇,定義一個隊列,把農夫的節點加進隊列,然後以這三種走法找牛,隊列先進先出,按順序直到找到牛的位置。
代碼:
#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
int n,k;
#define MAX 1e5
const int MAX_N=1e5+5;
int vist[MAX_N];
struct step
{
int x,sts;
step(int xx,int s):x(xx),sts(s){} //構造函數,但是有自定義構造函數以後,預設的構造函數不再起作用,所以如果有不賦初值的參數,需要再定義一個空構造函數
step(){} //空構造函數
};
queue<step> q;
int main()
{
scanf("%d%d",&n,&k);
memset(vist,0,sizeof(vist));
q.push(step(n,0));
vist[n]=1;
while(!q.empty()){
step s=q.front();
if(s.x==k){ //找到牛所在的位置
printf("%d\n",s.sts);
break;
}
else{ //三種情況
if(s.x-1>=0&&!vist[s.x-1]){
q.push(step(s.x-1,s.sts+1));
vist[s.x-1]=1;
}
if(s.x+1<=MAX&&!vist[s.x+1]){
q.push(step(s.x+1,s.sts+1));
vist[s.x+1]=1;
}
if(s.x*2<=MAX&&!vist[s.x*2]){
q.push(step(s.x*2,s.sts+1));
vist[s.x*2]=1;
}
}
q.pop(); //把走過的點走從隊列里刪掉
}
return 0;
}