haoi塔问题

问题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;
}


你可能感兴趣的:(haoi塔问题)