-
Notifications
You must be signed in to change notification settings - Fork 1
/
4-b8.cpp
131 lines (128 loc) · 3.68 KB
/
4-b8.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*1953609 软件 王灏廷*/
#include <iostream>
#include <iomanip>
using namespace std;
/* ----具体要求----
1、不允许添加其它头文件
2、不允许定义全局变量、仅允许hanoi中定义一个静态局部变量
3、允许添加用于输入层数、起始/目标柱的函数,函数中允许使用循环处理错误输入
4、如果输入用函数进行,则main中不允许出现任何形式的循环(while、do-while、for、if-goto)
如果输入在main中进行,则main中允许出现循环
--------------------------------------------------------------------- */
/***************************************************************************
函数名称:
功 能:打印n层汉诺塔的移动顺序
输入参数:int n:层数
char src:起始柱
char tmp:中间柱
char dst:目标柱
返 回 值:
说 明:1、函数名、形参、返回类型均不准动
2、本函数不允许出现任何形式的循环
3、允许定义一个静态局部变量
***************************************************************************/
void hanoi(int n, char src, char tmp, char dst)
{
static int sum = 1;
if (n == 1)
{
cout << setiosflags(ios::right) << setw(5) << sum << ":" << setw(3) << n << "# " << src << "-->" << dst << endl;
sum++;
}
else
{
hanoi(n - 1, src, dst, tmp);
cout << setiosflags(ios::right) << setw(5) << sum << ":" << setw(3) << n << "# " << src << "-->" << dst << endl;
sum++;
hanoi(n - 1, tmp, src, dst);
}
}
/***************************************************************************
函数名称:
功 能:
输入参数:
返 回 值:
说 明:完成输入(或调用输入函数)、调用递归函数
***************************************************************************/
int main()
{
int n;
while (1)
{
cout << "请输入汉诺塔的层数(1-16)" << endl;
cin >> n;
if (!cin.good() || n > 16 || n < 1)
{
cin.clear();
cin.ignore(2147483647, '\n');
continue;
}
else
{
cin.clear();
cin.ignore(2147483647, '\n');
break;
}
}
char start, end;
while (1)
{
cout << "请输入起始柱(A-C)" << endl;
cin >> start;
if (!cin.good() || start > 99 || start < 65 || (start < 97 && start>67))
{
cin.clear();
cin.ignore(2147483647, '\n');
continue;
}
else
{
if (start > 96)
start -= 32;
cin.clear();
cin.ignore(2147483647, '\n');
break;
}
}
while (1)
{
cout << "请输入目标柱(A-C)" << endl;
cin >> end;
if (!cin.good() || end > 99 || end < 65 || (end < 97 && end>67))
{
cin.clear();
cin.ignore(2147483647, '\n');
continue;
}
else if (end > 96)
{
end -= 32;
if (end == start)
{
cout << "目标柱(" << start << ")" << "不能与起始柱(" << end << ")相同" << endl;
continue;
}
}
else
{
if (end == start)
{
cout << "目标柱(" << start << ")" << "不能与起始柱(" << end << ")相同" << endl;
continue;
}
}
cin.clear();
cin.ignore(2147483647, '\n');
break;
}
char tmp = '0';
if ((start == 65 && end == 66) || (end == 65 && start == 66))
tmp = 'C';
else if ((start == 65 && end == 67) || (end == 65 && start == 67))
tmp = 'B';
else if ((start == 66 && end == 67) || (end == 66 && start == 67))
tmp = 'A';
cout << "移动步骤为:" << endl;
hanoi(n, start, tmp, end);
return 0;
}