欣杰最近在钻研约瑟夫问题,这个是经典的问题,他已经掌握了很多解决这个问题的方法,唯独链表方法没太搞明白。
N(N<100)个人坐成一个圈,编号1-N,从第一个人开始报数,数到M(M>1)的人出列,后面的人继续从1开始,最后剩下的人的初始编号是多少?
#include<bits/stdc++.h> using namespace std; int N,M,head,res,k,i,t; int arr[100][2]; int main() { cin>>N>>M; for(i=0;i<N-1;i++) { arr[i][0]=i+1; arr[i][1]=i+1; } //将尾节点的指向头节点,构成循环单向链表 arr[N-1][0]=______(1)________; arr[N-1][1]=______(2)________; head=0; res=N; k=head; i=1; while(res>1) { i++; if(i==______(3)________) { t=arr[k][1]; arr[k][1]=______(4)_________; if(t==head) //删除head节点 { head=_______(5)_________; } i=1; res--; } k=arr[k][1]; } cout<<______(6)________; }
1)第1空的答案为________
A. 0 B. 1 C. N-1 D. N
2)第2空的答案为________
A. 0 B. 1 C. N-1 D. N
3)第3空的答案为________
A. N B. N+1 C. M D. M+1
4)第4空的答案为________
A. arr[arr[i][1]][1] B. t C. arr[arr[t][1]][1] D. arr[t][1]
5)第5空的答案为________
A. arr[k][1] B. arr[t][1] C. arr[head][1] D. arr[i][1]
6)第6空的答案为________
A. arr[t][0] B. arr[0][0] C. arr[head][0] D. arr[i][0]
7)如果输入的N和M分别为15和4,则输出为________
A. 5 B. 13 C. 9 D. 14