被這道水題郁悶了好久,就像腦子轉不過來一樣,大致思路有,但是一直不懂得如何實現。
Last(x)表示順時針方向x位置的上一個有效位置;
Next(x)表示順時針方向x位置的下一個有效位置(x位置的數字允許已經被刪除);
下面的代碼中,即使只剩下一個元素也允許調用Last(x)、Next(x),因為此時x位置的數字已經刪除,Last(x)、Next(x)將返回僅剩的一個元素的位置;但是不存在元素的時候要及時break循環,否則調用Last(x)、Next(x)會死循環。最初就是這點沒有反應過來,寫了許多if來判斷各種情況,越寫越復雜。
以下是我的代碼:
#include<cstdio>
using namespace std;
const int kMaxn(27);
int n,k,m,cnt;
int r[kMaxn];
bool sign[kMaxn];
int Last(int pos)
{
int i(pos-1);
if(i<1)
i=n;
while(!r[i])
{
i--;
if(i<1)
i=n;
}
return i;
}
int Next(int pos)
{
int i(pos+1);
if(i>n)
i=1;
while(!r[i])
{
i++;
if(i>n)
i=1;
}
return i;
}
int main()
{
/*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
//*/
while(scanf("%d%d%d",&n,&k,&m)==3 && (n || k ||m))
{
for(int i=1;i<=n;i++)
{
r[i]=i;
sign[i]=false;
}
int i(n),j(1),ans[kMaxn];
cnt=0;
while(true)
{
for(int v=1;v<=k;v++)
i=Next(i);
for(int v=1;v<=m;v++)
j=Last(j);
if(i==j)
{
cnt++;
ans[cnt]=r[i];
if(cnt<n)
sign[cnt]=true;
if(cnt>=n)
break;
r[i]=0;
i=Last(i);
j=Next(j);
}
else
{
cnt++;
ans[cnt]=r[i];
cnt++;
ans[cnt]=r[j];
if(cnt<n)
sign[cnt]=true;
if(cnt>=n)
break;
r[i]=r[j]=0;
i=Last(i);
j=Next(j);
}
}
for(int i=1;i<=n;i++)
{
printf("%3d",ans[i]);
if(sign[i])
printf(",");
}
printf("\n");
}
return 0;
}
posted on 2011-04-13 20:46
lee1r 閱讀(514)
評論(0) 編輯 收藏 引用 所屬分類:
題目分類:基礎/模擬 、
題目分類:數據結構