sicily 1028.Hanoi Tower Sequence

来源:互联网 发布:网络与诸葛亮什么意思 编辑:程序博客网 时间:2024/05/15 23:52

解题思路:

1: 1

2: 1   2   1

3: 1   2   1   3   1   2   1

4: 1   2   1   3   1   2   1   4   1   2   1   3   1   2   1

    [1] [2] [3] [4] [5] [6] [7] [8] [9] ……

从例子中可以看出以下规律:

1、红色字体的数字左右两边出现的次数和顺序都一样

2、以第四组为例,下面中括号的数字表示的是操作的步数。

①、每一个盘子出现的间隔是一样的。如盘子1出现的步数是:1、3、5、7....。

盘子2出现的步数是:2、6、10....。

②、设题目给出的步数是P,则可以进一步发现 若 P%2 = 1,则可以知道出现在这一步的是盘子1.若P%4 = 2,则出现在这一步的是盘子2.若P%8 = 3,则出现在这一步的是盘子3.

从而推出P能被2整除的次数+1就是在第P步时出现的盘子。

#include <iostream>#include <string>using namespace std;int getMode(string a,int b){int temp = 0;for(int i = 0;i < a.length();i++){int t = temp * 10 + (a[i] - '0');temp = t % b;}return temp;}string div(string a,int b){string result = "";int temp = 0;for(int i = 0;i < a.length();i++){int t = temp * 10 + (a[i] - '0');temp = t % b;result += (t / b + '0');}return result;}int cal(string s){int count = 1;while(1){if(getMode(s,2) == 0){count++;s = div(s,2);}else{return count;}}}                        int main(){    int cases;int caseid = 0;cin >> cases;int count = cases;while(cases--){caseid++;string s;cin >> s;if(caseid == count){cout << "Case " << caseid << ": " << cal(s) << endl;}else{cout << "Case " << caseid << ": " << cal(s) << endl;cout << endl;}}    return 0;}                                 


原创粉丝点击