A disk can be rotated between horizontal and vertical only if it is positioned over theindentation marked `0' and the disk on its right is vertical . The right-mostdisk can always rotate if it is in position `0' since it has no disk on its right.
The aim is to free the slide by moving it so its left edge aligns with the `Win' mark:
Your task is to write a program which will take several part-solved puzzles and computethe number of steps needed to move the slide to position `Win' for each puzzle.
Input
There will be several puzzles in the input file. The first line of the file willcontain an integer n specifying the number of puzzles. There will then be nlines, each of the form:
length orientations position
where length(length < 30) is an integer indicating the number of disks on theslide, orientations is a string of length characters from the set {h,v}giving the orientation of each disk from left to right, and position is an integerfrom 0 to length specifying the numbered mark which aligns with the left edge ofthe slide.
Output
For each puzzle, your program should output one integer on a line which counts theminimum number of steps needed to win the puzzle. A step is either a movement of theslide, one unit left or right, or the rotation of a disk.
Sample Input
2 2 vv 2 7 vhhhvhh 4
Output for the SampleInput
7 357
Diagram of the 1stPuzzle
用递推方法
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
const int N = 30;
typedef long long LL;
LL f[N + 5];
string orientation;
int length;
int position;
void init()
{
f[0] = 0;
for (int i = 1; i <= N; i++) {
f[i] = f[i - 1] * 2 + 2 * i - 1;
}
}
void input()
{
cin >> length >> orientation >> position;
}
void solve()
{
size_t len = orientation.length();
LL ans = 0;
int sign = 1;
for (size_t i = 0; i < len; i++) {
if (orientation[i] == 'v') {
ans += sign * (f[length - i]);
sign *= -1;
}
}
ans += position + 1;
cout << ans << endl;
}
int main(int argc, char **argv)
{
#ifndef ONLINE_JUDGE
freopen("d:\\OJ\\uva_in.txt", "r", stdin);
#endif
init();
int t ;
cin >> t;
while (t--) {
input();
solve();
}
return 0;
}