深搜,练习代码
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int cowPos,num=0;//牛的位置,当前总步数
int MinNum = 1 << 30;
int NumFlags[1001];
stack<int> numStk;//记录当前路径
stack<int> lastStk;//最优路径显示
void Dfs(int n){
if (n == cowPos && num<MinNum) {//终止条件
MinNum = min(MinNum, num);
lastStk = numStk;
return;
}
if (num >= MinNum) return;
if (n + 1 <= 1000 && NumFlags[n+1]==0) {
NumFlags[n + 1] = 1;//向右走一步
++num;//步数加1
numStk.push(n+1);//位置入栈
Dfs(n + 1);
--num;
numStk.pop();
NumFlags[n + 1] = 0;
}
if (n - 1 >= 0 && NumFlags[n - 1] == 0) {
NumFlags[n - 1] = 1;//向左走一步
++num;
numStk.push(n - 1);
Dfs(n - 1);
--num;
numStk.pop();
NumFlags[n - 1] = 0;
}
if (2*n<=1000 && NumFlags[2 * n] == 0) {
NumFlags[2*n] = 1;//向左翻倍
++num;
numStk.push(2*n);
Dfs(2*n);
--num;
numStk.pop();
NumFlags[2*n] = 0;
}
return;
}
int main() {
int famPos;//农夫位置
cout << "输入农夫和牛的位置:";
cin >> famPos >> cowPos;
memset(NumFlags, 0, sizeof(NumFlags));
NumFlags[famPos] = 1;
numStk.push(famPos);
Dfs(famPos);
if (MinNum == 1 << 30)
cout << 0 << endl;
else
cout << MinNum << endl;
cout << endl;
while (!lastStk.empty())//输出路径
{
cout << lastStk.top() << " ";
lastStk.pop();
}
return 0;
}