軍隊問題--線性連結串列的操作
阿新 • • 發佈:2019-02-12
亞剋星上住著許多神奇的生物。其中有聰慧的人族、優雅的精靈、彪悍的野蠻豬、粗魯
的首任駐….有一天,住在湛藍球上的惡魔們突破空間的封鎖入侵這個美麗的星球。為了保
衛共同的家園,亞剋星各族不得不摒棄前嫌,組成聯盟。為了更有利的反擊惡魔們的入侵,
他們建立了統一的軍事指揮中心。在前期,指揮中心會不停的釋出軍隊調動命令,可是,蠻
煩來了。為了更好的做出決策,指揮中心必須迅速瞭解己方的各地區的軍事力量詳情。你能
否幫幫這些可憐的種族呢?
每個地區有一個編號(從1 到N),如果一個地區有軍隊的話,這些軍隊將組成一個軍
團。指揮中心將釋出的命令如下:
U a b:將b 地區軍團的調到a 地區,從而組成一個新的軍團。為了便於管理,每次新加入的軍隊將按順序加入到a 軍團後面。資料保證a 與b 不相同。
I a x:將一支人數為x 的軍隊調到a 地區。為了便於管理,每次新加入的軍隊將加入到
a 軍團前面。
D a x:將a 地區中軍隊人數為x 的調走。若不存在,則不執行。
Q a:詢問a 地區的具體軍事資訊(即按順序輸出該軍團中每個軍隊的人數)。
==================================================
輸入第一行為一個正整數N ,M(2 <= N,M <= 1000)。
接下來N 行,每行第一個數K 表示該地區軍隊的個數K(1<=K<=100),接下來K 個數
表示各個軍隊的人數資訊(0<=ai<2^31)。
接下來M 行,每行一個操作。
★資料輸出
對於每個詢問操作,輸出一行表示a 地區具體軍事資訊,每兩個數之間空格隔開,,行末無空格。若a 內無元素,輸出-1。
=============
3 9
2 1 2
3 1 2 3
4 3 2 1 3
U 1 2
Q 1
Q 2
U 3 1
Q 3
I 1 1
Q 1
D 3 1
Q 3
===============
1 2 1 2 3
-1
3 2 1 3 1 2 1 2 3
的首任駐….有一天,住在湛藍球上的惡魔們突破空間的封鎖入侵這個美麗的星球。為了保
衛共同的家園,亞剋星各族不得不摒棄前嫌,組成聯盟。為了更有利的反擊惡魔們的入侵,
他們建立了統一的軍事指揮中心。在前期,指揮中心會不停的釋出軍隊調動命令,可是,蠻
煩來了。為了更好的做出決策,指揮中心必須迅速瞭解己方的各地區的軍事力量詳情。你能
否幫幫這些可憐的種族呢?
每個地區有一個編號(從1 到N),如果一個地區有軍隊的話,這些軍隊將組成一個軍
團。指揮中心將釋出的命令如下:
U a b:將b 地區軍團的調到a 地區,從而組成一個新的軍團。為了便於管理,每次新加入的軍隊將按順序加入到a 軍團後面。資料保證a 與b 不相同。
I a x:將一支人數為x 的軍隊調到a 地區。為了便於管理,每次新加入的軍隊將加入到
a 軍團前面。
D a x:將a 地區中軍隊人數為x 的調走。若不存在,則不執行。
Q a:詢問a 地區的具體軍事資訊(即按順序輸出該軍團中每個軍隊的人數)。
==================================================
輸入第一行為一個正整數N ,M(2 <= N,M <= 1000)。
接下來N 行,每行第一個數K 表示該地區軍隊的個數K(1<=K<=100),接下來K 個數
表示各個軍隊的人數資訊(0<=ai<2^31)。
接下來M 行,每行一個操作。
★資料輸出
對於每個詢問操作,輸出一行表示a 地區具體軍事資訊,每兩個數之間空格隔開,,行末無空格。若a 內無元素,輸出-1。
=============
3 9
2 1 2
3 1 2 3
4 3 2 1 3
U 1 2
Q 1
Q 2
U 3 1
Q 3
I 1 1
Q 1
D 3 1
Q 3
===============
1 2 1 2 3
-1
3 2 1 3 1 2 1 2 3
13
2 3 2 2 3
// // main.c // 軍隊問題 // // Created by Rand01ph on 12-12-7. // Copyright (c) 2012年 Rand01ph. All rights reserved. // #include <stdio.h> #include <string.h> int U (int a,int b); int Q (int a); int I (int a,int x); int D (int a,int x); typedef struct jundui { int num; struct jundui *next; }AMY; typedef struct area { AMY *head; int amy_num; }AREA; int add(AREA *p,int data); AREA *all[110]; int main() { AREA *p; int i; int N,M; scanf("%d %d\n",&N,&M); for (i=0; i<N; i++) { p=(AREA*)malloc(sizeof(AREA)); if (p==NULL) { return 0; } p->amy_num=-1; p->head=NULL; all[i]=p; p=NULL; } int j,k,data; for (i=0; i<N; i++) { scanf("%d ",&j); all[i]->amy_num=j; for (k=0; k<j-1; k++) { scanf("%d ",&data); add(all[i], data); } scanf("%d \n",&data); add(all[i], data); } char set; int sec,thi; for (i=0; i<M; i++) { scanf("%c ",&set); switch (set) { case 'U': scanf("%d %d\n",&sec,&thi); U(sec-1, thi-1); break; case 'I': scanf("%d %d\n",&sec,&thi); U(sec-1, thi); break; case 'D': scanf("%d %d\n",&sec,&thi); U(sec-1, thi); break; case 'Q': scanf("%d\n",&sec); Q(sec-1); break; } } return 0; } int add(AREA *p,int data) { AMY *new=(AMY *)malloc(sizeof(AMY)); AMY *find; new->num=data; new->next=NULL; if(p->head==NULL) { p->head=new; return 0; } find=p->head; while (find->next) { find=find->next; } find->next=new; return 0; } int U(int a,int b) { AMY *find; AMY *a_; AMY *b_; a_=all[a]->head; b_=all[b]->head; if (a_==NULL) { a_=b_; b_=NULL; all[a]->amy_num+=all[b]->amy_num; all[b]->amy_num=-1; return 0; } find=a_; while (find->next) { find=find->next; } find->next=b_; b_=NULL; all[a]->amy_num+=all[b]->amy_num; all[b]->amy_num=-1; return 0; } int I(int a,int x) { AREA *p=all[a]; AMY *new=(AMY *)malloc(sizeof(AMY)); new->num=x; (p->head)->next=new->next; p->head=new; if (p->amy_num==-1) { p->amy_num=1; return 0; } p->amy_num++; return 0; } int D(int a,int x) { AREA *p=all[a]; AMY *h=p->head; AMY *p1,*p2,*p3; int statue=0; if (h==NULL) { return 0; } p1=h; p2=h->next; if (p1->num==x) { statue=1; } while (p2) { if (p2->num==x) { p3=p2; p2=p2->next; p1->next=p2; free(p3); } p1=p2; p2=p2->next; } if (statue) { p1=h->next; free(h); p->amy_num--; if (p->amy_num==0) { p->amy_num=-1; p->head=NULL; } } return 0; } int Q(int a) { AREA *p=all[a]; AMY *check; int i=1; if (p->amy_num==-1) { printf("-1\n"); return 0; } check=all[a]->head; while (check) { if (i) { printf("%d",check->num); check=check->next; i=0; continue; } printf(" %d\n",check->num); check=check->next; } printf("\n"); return 0; }