-
Notifications
You must be signed in to change notification settings - Fork 1
/
4-b7.cpp
127 lines (124 loc) · 3.49 KB
/
4-b7.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
/*1953609 软件 王灏廷*/
#include <iostream>
#include <iomanip>
using namespace std;
/* ----具体要求----
1、不允许添加其它头文件
2、不允许定义全局变量、静态局部变量
3、允许添加用于输入层数、起始/目标柱的函数,函数中允许使用循环处理错误输入
4、如果输入用函数进行,则main中不允许出现任何形式的循环(while、do-while、for、if-goto)
如果输入在main中进行,则main中允许出现循环
--------------------------------------------------------------------- */
/***************************************************************************
函数名称:
功 能:打印n层汉诺塔的移动顺序
输入参数:int n:层数
char src:起始柱
char tmp:中间柱
char dst:目标柱
返 回 值:
说 明:1、函数名、形参、返回类型均不准动
2、本函数不允许出现任何形式的循环
***************************************************************************/
void hanoi(int n, char src, char tmp, char dst)
{
if (n == 1)
{
cout << setiosflags(ios::right) << setw(2) << n << "# " << src << "-->" << dst << endl;
}
else
{
hanoi (n-1, src, dst, tmp);
cout << setiosflags(ios::right) << setw(2) << n << "# " << src << "-->" << dst << endl;
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;
}