建立循环链表,一次删除符合结点,最后剩下一个即为所求结点
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct node
{
int num;
node * next;
};
void initqueen(int n,node * queen)
{
int i;
node * r,*s;
r=s=queen;
for(i=2;i<=n;i++)//2到n结点
{
s = (node *)malloc(sizeof(node));
s->num = i;
s->next = NULL;
r->next = s;
r = s;
}
// printf("r=%d\n",r->num);
r->next = queen;//最后一个结点指向头结点,形成循环队列
}
int solve(int n,int m,node * queen)
{
int i,j;
node * s;
node *p = queen;
// printf("q = %d\n",queen->num);
s = p;
for(i=1;i<n;i++)
{
// printf("p=%d\n",p->num);
for(j=1;j<m;j++)
{
s = p;
p=p->next;
// s = p;
}
// printf("*p=%d\n",p->num);
s->next = p->next;
free(p);
p = s->next;
}
return p->num;
}
int main()
{
int m,n;
node * queen;
while(scanf("%d%d",&n,&m),m&&n)
{
// printf("n=%d,m=%d\n",n,m);
if(n==1) {
printf("1\n"); continue;
}
if(m==1){
printf("%d\n",n); continue;
}
queen = (node *)malloc(sizeof(node)); //第一个结点
queen->num = 1;
queen->next = NULL;;
initqueen(n,queen);
printf("%d\n",solve(n,m,queen));
}
return 0;
}