问题1:
对于传统的汉诺塔游戏我们做一个拓展,我们有从大到小放置的n个圆盘,开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱子上,请实现一个函数打印最优移动轨迹。
给定一个int n,表示有n个圆盘。请返回一个string数组,其中的元素依次为每次移动的描述。描述格式为: move from [left/mid/right] to [left/mid/right]。
测试样例:
1
返回:move from left to right
[from 牛客网]
#include <iostream> #include <vector> #include <stdio.h> #include <string.h> using namespace std; vector<string> getSolution(int); void hanoi(int, char*, char*, char*, vector<string>&); int main(int argc, char* argv[]) { int n = 3; vector<string> mesg; mesg = getSolution(n); vector<string>::iterator d = mesg.begin(); for (;d != mesg.end(); d++) cout << *d << std::endl; } /* 调用hanoi函数的函数,参数n为hanoi层数 */ vector<string> getSolution(int n) { // write code here vector<string> vec; char from[] = "left"; char by[] = "mid"; char to[] = "right"; hanoi(n, from, by, to, vec); return vec; } /* hanoi递归函数,n 层数,from 起始杆,by 中间杆, to 目的杆 */ void hanoi(int n, char* from, char *by, char*to, vector<string> &vec) { char str[30]; //若层数为1,则直接移动 if (n == 1) { sprintf(str, "move from %s to %s", from, to); vec.push_back(str); return; } //先移动前n-1层,此时,中间杆 和目的杆互换 hanoi(n - 1, from, to, by, vec); memset(str, 0, 30); //移动完n-1层,最后一个 sprintf(str, "move from %s to %s", from, to); vec.push_back(str); //此时前n-1在中间杆,再从中间杆移到目的杆,通过起始杆 hanoi(n-1, by, from, to, vec); }
问题2:
有一个int数组arr其中只含有1、2和3,分别代表所有圆盘目前的状态,1代表左柱,2代表中柱,3代表右柱,arr[i]的 值代表第i+1个圆盘的位置。比如,arr=[3,3,2,1],代表第1个圆盘在右柱上、第2个圆盘在右柱上、第3个圆盘在中柱上、第4个圆盘在左柱 上。如果arr代表的状态是最优移动轨迹过程中出现的状态,返回arr这种状态是最优移动轨迹中的第几个状态。如果arr代表的状态不是最优移动轨迹过程 中出现的状态,则返回-1。
给定一个int数组arr及数组的大小n,含义如题所述,请返回一个int,代表所求的结果。
测试样例:
[3,3]
返回:3
[from 牛客网]
#include <iostream> #include <vector> #include <stdio.h> #include <algorithm> using namespace std; //flag 用于标记是否存在,且保存具体第几个状态 int flag = -1; //程序运行过程中, vector动态随hanoi塔变化,m记录当前为第几个状态,相等则赋值给flag int m = 0; void hanoi(int n, int f, int b, int t, int m, vector<int> &vec, vector<int> &arr); int chkStep(vector<int> &arr, int n); int main(int argc, char* argv[]) { int n; vector<int> mesg; mesg.push_back(2); mesg.push_back(3);mesg.push_back(3);mesg.push_back(3); //mesg.push_back(3);mesg.push_back(2);mesg.push_back(2);mesg.push_back(3); n = chkStep(mesg, 4); printf("%d\n", flag); } void hanoi(int n, int f, int b, int t, vector<int> &vec, vector<int> &arr) { vector<int>::iterator i; //判断此时vector是否与给定相等,若相等则将值赋非flag if (vec == arr) flag = m; if (n == 1) { //查找vector,由于查找由前向后,则先找到的一定是最小的,即在给定杆最上面的 i = find(vec.begin(), vec.end(), f); *i = t; m++; if (vec == arr) flag = m ; return; } hanoi(n-1, f, t, b, vec, arr); i = find(vec.begin(), vec.end(), f); *i = t; m++; if (vec == arr) flag = m; hanoi(n-1, b, f, t, vec, arr); } int chkStep(vector<int> &arr, int n) { // write code here int i; vector<int> vec; for( i = 0;i < n;i++) vec.push_back(1); hanoi(n, 1, 2, 3, vec, arr); return flag; }