【例1】直线队列报数问题:
1号-100号共100人站成一队,按顺序1、2、3报数,报到3的人退出队伍,剩下的人从头开始重新1、2、3报数......,这样一直进行下去,{zh1}剩下的5个人分别是多少号?
【程序思路】:
开a数组,存放各人号码
开b数组,存放各人状态
位置计数器清零
报数计数器清零
退队人数计数器清零
repeat循环
位置计数器加1
如果位置计数器=101,说明到队尾,
要做的事:位置计数器清0
报数计数器清0
如果状态为T,报数计数器加1
如果报数计数器=3,
要做的事:报数计数器清0
修改此人状态为F,表示退队
退队计数器加1
直到退队人数=95
for循环刷一遍b数组,发现T,就输出对应的a数组号码
【参考程序】:
var a:array [1..100] of integer; //队员号码数组
b:array [1..100] of boolean; //队员状态数组
wz:integer; //位置计数器
bs:integer; //报数计数器
td:integer; //退队计数器
begin
for wz:=1 to 100 do begin
a[wz]:=wz;
b[wz]:=true;
end;
wz:=0;bs:=0;td:=0;
repeat
inc(wz);
if wz=101 then begin
wz:=1;
bs:=0;
end;
if b[wz] then inc(bs);
if bs=3 then begin
bs:=0;
b[wz]:=false;
inc(td);
end;
until td=95;
for wz:=1 to 100 do if b[wz] then write(a[wz]:4);writeln;
readln;
end.
———————————————————————
【例2】环形队列报数问题:
1号-100号共100人围成一圈,从1号开始按顺序1、2、3报数,报到3的人退出队伍,循环进行下去,{zh1}剩下的5个人分别是多少号?
【程序思路】:
开a数组,存放各人号码
开b数组,存放各人状态
位置计数器清零
报数计数器清零
退队人数计数器清零
repeat循环
位置计数器加1
如果位置计数器=101,
要做的事:位置计数器置1
如果状态为T,报数计数器加1
如果报数计数器=3,
要做的事:报数计数器清0
修改此人状态为F,表示退队
退队计数器加1
直到退队人数=95
for循环刷一遍b数组,发现trueT,就输出对应的a数组号码
【参考程序】:
var a:array [1..100] of integer; //队员号码数组
b:array [1..100] of boolean; //队员状态数组
wz:integer; //位置计数器
bs:integer; //报数计数器
td:integer; //退队计数器
begin
for wz:=1 to 100 do begin
a[wz]:=wz;
b[wz]:=true;
end;
wz:=0;bs:=0;td:=0;
repeat
inc(wz);
if wz=101 then begin
wz:=1;
end;
if b[wz] then inc(bs);
if bs=3 then begin
bs:=0;
b[wz]:=false;
inc(td);
end;
until td=95;
for wz:=1 to 100 do if b[wz] then write(a[wz]:4);writeln;
readln;
end.