问题
1195: 猴子选大王(结构体专题)
时间限制: 1 Sec 内存限制: 128 MB
提交: 3404 解决: 2143
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
输入
输入两个整数n和m,1<=m<=n<=100。
输出
输出猴王的编号
样例输入 Copy
8 3
样例输出 Copy
7
代码
#include <iostream>
using namespace std;
struct Monkey {
int val = -1;
// int flag = 1;
Monkey * next;
};
Monkey * createCircleList(int n);
int getCircleSize( Monkey * mons );
Monkey * delCircleMember(Monkey * mons);
void printCircle(Monkey * mons);
int main() {
Monkey * mons;
int n, m, size, cnt = 0;
cin >> n >> m;
mons = createCircleList( n );
// printCircle( mons );
// cout << getCircleSize( mons ) << endl;
// mons = mons->next;
// mons = mons->next;
// mons = delCircleMember(mons);
// printCircle( mons );
// cout << getCircleSize( mons ) << endl;
while (true) {
//if ( mons->val = -1 ) mons = mons->next;
size = getCircleSize( mons );
if ( size == 1 ) {
//if (mons->val == -1) continue;
cout << mons->val << endl;
break;
}
else {
cnt++;
if ( !( cnt % m ) ) {
mons = delCircleMember(mons);
// cout << "============================\n";
// printCircle( mons );
// cout << getCircleSize( mons ) << endl;
// cout << "============================\n";
cnt = 0;
}
else mons = mons->next;
}
}
return 0;
}
Monkey * createCircleList(int n) { // 创建链表时,把初始的头节点去除掉
Monkey * head, * node, * end;
head = new Monkey;
head->next = head;
end = head;
for ( int i = 1; i <= n; i++ ) {
node = new Monkey;
node->val = i;
node->next = end->next;
end->next = node;
end = node;
}
end->next = head;
head = delCircleMember(head); // 创建链表时,把初始的头节点去除掉
return head;
}
void printCircle(Monkey * mons) {
Monkey * head = mons;
while ( mons->next != head ) {
cout << mons->val << " ";
mons = mons->next;
}
cout << mons->val<< endl;
}
int getCircleSize( Monkey * mons ) {
Monkey * head = mons;
int cnt = 0;
while ( mons->next != head ) {
cnt++;
mons = mons->next;
}
return ++cnt;
}
Monkey * delCircleMember(Monkey * mons) {
Monkey * head = mons;
mons = mons->next;
while ( mons->next != head ) {
mons = mons->next;
}
head = head->next;
mons->next = head;
return head;
}
小结
继续加油!