7-22 jmu-ds-小孩報數問題 (15 分)
阿新 • • 發佈:2018-12-12
7-22 jmu-ds-小孩報數問題 (15 分)
有N個小孩圍成一圈,給他們從1開始依次編號,現指定從第W個開始報數,報到第S個時,該小孩出列,然後從下一個小孩開始報數,仍是報到S個出列,如此重複下去,直到所有的小孩都出列(總人數不足S個時將迴圈報數),求小孩出列的順序。
輸入格式:
第一行輸入小孩的人數N(N<=64) 接下來每行輸入一個小孩的名字(人名不超過15個字元) 最後一行輸入W,S (W < N),用逗號”,”間隔
輸出格式:
按人名輸出小孩按順序出列的順序,每行輸出一個人名
輸入樣例:
5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3
輸出樣例:
Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi
分析:約瑟夫環。這個題的資料錯了,真坑,同學們人肉資料發現,第二組需要用cin,其餘用getline,怎麼分辨的,不屈的同學們發現第二組的n小於等於4。。。好了。。。解決了
折柳我用的是雙向迴圈連結串列
程式碼:
#include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <string> #include <cstdio> #include <vector> #include <iomanip> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define LIST_INIT_SIZE 100000 #define LISTINCREMENT 10 #define mod 256 #define lowbit(x) (x&(-x)) #define mem(a,b) memset(a,b,sizeof(a)) #define FRER() freopen("in.txt","r",stdin); #define FREW() freopen("out.txt","w",stdout); using namespace std; const int maxn = 20 + 7; char s[maxn]; int n; typedef struct LNode{ string name; struct LNode* next; struct LNode* pre; }LNode,*LinkList; void CreateList(LinkList&L,int n){ L = (LinkList)malloc(sizeof(LNode)); LinkList p = L; for(int i=1;i<=n;i++){ LinkList q = (LinkList)malloc(sizeof(LNode)); string ss; if(n<5) cin>>ss; else getline(cin, ss); q->name = ss; p->next = q; q->pre = p; p = q; } p->next = L->next; L->next->pre = p; } void print(LinkList&L){ LinkList p =L->next; int n = 10; while(n--){ cout<<p->name<<endl; p = p->pre; } } void fun(LinkList&L,int pos,int k,int n){ LinkList p = L->next; for(int i=1;i<pos;i++) p = p->next; while(p->next!=p){ for(int i=1;i<k;i++) p=p->next; cout<<p->name<<endl; p->pre->next = p->next; p->next->pre = p->pre; LinkList q = p; p = p->next; free(q); } cout<<p->name<<endl; free(p); free(L); } int main(){ int n,pos,k; scanf("%d",&n); if(n>=5) getchar(); LinkList L; CreateList(L, n); // cout<<L->next->pre->next->name<<endl; // print(L); scanf("%d,%d",&pos,&k); fun(L,pos,k,n); }