1. 程式人生 > >用鏈表實現輕院1276士兵隊列訓練問題

用鏈表實現輕院1276士兵隊列訓練問題

size type typedef rom 測試 sub tro amp align

士兵隊列訓練問題

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8554 Accepted Submission(s): 3809

Problem Description 某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。 Input
本題有多個測試數據組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。 Output 共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。 Sample Input 2 20 40 Sample Output 1 7 19 1 19 37 題目連接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 該題需要註意n<=3的情況: 當n=1時輸出1; 當n=2時輸出1 2; 當n=3時輸出1 2 3;
 1 #include<stdio.h>
 2 
 3 typedef struct
node{ 4 int date; 5 struct node *next; 6 }*LinkList; 7 8 LinkList Buile(int n); 9 void delNextNode(LinkList p); 10 int Find(LinkList head, int m, int k); 11 void CountOff(int n); 12 13 int main() 14 { 15 int i, N, n; 16 scanf("%d", &N); 17 while(N--){ 18 scanf("
%d", &n); 19 if(n <= 3){ 20 printf("1"); 21 for(i = 2; i <= n; i++) 22 printf(" %d", i); 23 printf("\n"); 24 continue; 25 } 26 CountOff(n); 27 } 28 return 0; 29 } 30 void CountOff(int n) 31 { 32 int k = 2; 33 LinkList head, p; 34 head = Buile(n); 35 while(1){ 36 if(k == 2) 37 k = 1; 38 else 39 k = 2; 40 n = Find(head, n, k); 41 if(n <= 3) 42 break; 43 } 44 45 p = head->next; 46 while(p){ 47 if(k){ 48 printf("%d", p->date); 49 k = 0; 50 } 51 else 52 printf(" %d", p->date); 53 p = p->next; 54 } 55 printf("\n"); 56 } 57 LinkList Buile(int n) 58 { 59 LinkList rear, p, head = new node; 60 rear = head; 61 for(int i = 1; i <= n; i++){ 62 p = new node; 63 p->date = i; 64 rear->next = p; 65 rear = p; 66 } 67 rear->next = NULL; 68 return head; 69 } 70 void DelNextNode(LinkList p) 71 { 72 LinkList pre; 73 pre = p->next; 74 p->next = pre->next; 75 delete pre; 76 } 77 int Find(LinkList head, int m, int k) 78 { 79 int i; 80 LinkList pre = head; 81 while(pre){ 82 i = k; 83 while(i--){ 84 if(pre == NULL) 85 return m; 86 pre = pre->next; 87 } 88 if(!pre || pre->next == NULL) 89 return m; 90 DelNextNode(pre); 91 m--; 92 } 93 return m; 94 }

用鏈表實現輕院1276士兵隊列訓練問題