UVa OJ The Dole Queue 救濟金髮放 133
題目大意:
給定一個整數 N ,然後逆時針排列從 1 到 N ,然後給定兩個整數 k 和 m ,順時針從 1 數到 k,選定這個數(假設爲 w),逆時針(從N)開始,然後數 m 個數,選定這個數爲(f),若 w 不等於 f,則將這兩個數輸出,並且 w 在前,若 w 等於 f,則只輸出 其中的一個。輸出後,刪除這兩個數,在這之後各自又從下一個數開始數 k 和 m 個數;如此循環,直到這 N 個數完全被輸出。
解題思路:
使用雙向鏈表。AC代碼如下,僅供參考。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<deque>
#define MAXN 20
using namespace std;
typedef struct node{
int value;
struct node *former,*laster;
}NODE;
NODE* newnode(){
NODE* u=(NODE*)malloc(sizeof(NODE));
if(u!=NULL){
u->value=0;
u->former=u->laster=NULL;
}
return u;
}
int main(){
#ifdef LOCAL
freopen("133_input.txt","r",stdin);
freopen("133_output.txt","w",stdout);
#endif
int N,k,m;
NODE* t[MAXN];
while(~scanf("%d%d%d",&N,&k,&m)){
if(N==0&&k==0&&m==0)
break;
for(int i=1;i<=N;i++)
t[i]=newnode();
for(int i=1;i<=N;i++){
t[i]->value=i;
if(i==1)
t[i]->former=t[N];
else
t[i]->former=t[i-1];
if(i==N)
t[i]->laster=t[1];
else
t[i]->laster=t[i+1];
}
NODE *fp=t[1],*bp=t[N];
while(fp!=NULL){
for(int i=0;i<k-1;i++)
fp=fp->laster;
for(int i=0;i<m-1;i++)
bp=bp->former;
NODE *tmp1=fp,*tmp2=bp;
if(fp->value==bp->value){
printf("%3d",fp->value);
if(fp->laster->value==fp->value){
free(tmp1);
fp=bp=NULL;
}
else{
fp=fp->laster;
bp=bp->former;
tmp1->former->laster=tmp1->laster;
tmp1->laster->former=tmp1->former;
free(tmp1);
}
}
else{
printf("%3d%3d",fp->value,bp->value);
if(fp->laster->laster->value==fp->value){
free(tmp1);
free(tmp2);
fp=bp=NULL;
}
else{
if(fp->laster->value==bp->value){
bp->laster->former=fp->former;
fp->former->laster=bp->laster;
fp=fp->laster->laster;
bp=bp->former->former;
free(tmp1);free(tmp2);
}
else{
fp=fp->laster;
bp=bp->former;
tmp1->former->laster=tmp1->laster;
tmp1->laster->former=tmp1->former;
free(tmp1);
tmp2->former->laster=tmp2->laster;
tmp2->laster->former=tmp2->former;
free(tmp2);
}
}
}
if(fp!=NULL)
printf(",");
}
printf("\n");
}
return 0;
}