本文共 982 字,大约阅读时间需要 3 分钟。
8487 | 43.29% | 3712 | |
题目类型: 数据结构, 链表
题意: N份申请书,排成一个圆圈, 按逆时针方向编号为1~N。 有两个公务员,公务员1站在1,往逆时针方向数到第k份,选中;公务员2站在N,往顺时针方向数到第m份,选中。 取走选中的编号的申请书,输出编号。如果编号一样,则只输出一个数。 直到所有申请书都拿光。
解体思路: 用循环链表模拟,取走的编号从链表中删除。这一题最难的地方在于两个人删除之后,他们的新位置的判断和选择,因为第一个人的新位置可能时第二个人要删除的位置,同理,第二个人的新位置也可能时第一个人要删除的位置。 最后, 循环结束的判断。 这些在代码里会有详细的注释
输入:
10 4 30 0 0
输出:
4 8, 9 5, 3 1, 2 6, 10, 7
where represents a space.
#include#include int prev[25];int next[25];int N, pos1, pos2,m,n;// 删除节点void remove(int n){ next[prev[n]] = next[n]; prev[next[n]] = prev[n];}void init(){ memset(prev,0,sizeof(prev)); memset(next,0,sizeof(next)); for(int i=1; i<=N;i++){ prev[i]=i-1; next[i]=i+1; } prev[1]=N; next[N]=1; pos1=1; pos2=N;}void solve(){ while(1){ if(prev[pos2]==pos2 || next[pos1]==pos1 ){ printf("%3d\n",pos1); break; } // 第一个人进行移动 int stepNum=1; while(stepNum++
转载地址:http://puzni.baihongyu.com/