题目
现在有M个凳子排成一个圈,我们顺时针给凳子依次编号为1,2,3……,M。我们从编号为S的凳子开始,每次先顺时针数N个凳子,将第N个凳子搬走,然后再逆时针数K个凳子,将第K个凳子搬走。每次都这样先顺时针数N个,再逆时针数K个,直到只剩1个凳子,直接搬走。最后,我们想知道M个凳子的搬走顺序。
题解
模拟
数据小的情况下一个个模拟可以过
可用链表模拟
双向链表
时间复杂度O(m)
代码
var
m,s,n,k,i,j:longint;
a,f:array[0..1000]of longint;
begin
assign(input,'game.in');
assign(output,'game.out');
reset(input);rewrite(output);
readln(m);
readln(s);
readln(n);
readln(k);
for i:=1 to m-1 do
a[i]:=i+1;
a[m]:=1;
for i:=m downto 2 do
f[i]:=i-1;
f[1]:=m;i:=0;
s:=s-1;if s=0 then s:=m;
while i<m do
begin
inc(i);
for j:=1 to n do
s:=a[s];
write(s,' ');
a[f[s]]:=a[s];f[a[s]]:=f[s];
if i<m then
begin
inc(i);
for j:=1 to k do
s:=f[s];
write(s,' ');
a[f[s]]:=a[s];f[a[s]]:=f[s];
end;
end;
close(input);close(output);
end.