free pascal如何解决5错误你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/13 03:32:49

free pascal如何解决5错误你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3
free pascal如何解决5错误
你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3

free pascal如何解决5错误你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3
此题我首先想到是字符串处理,将其断开点扫描一遍并且记录开最大值,在每个断开点中,向左或向右扫描,左边的第一个是什么颜色,就以此颜色当做目标颜色扫描,可是如果遇到白色的那就继续向左扫描,知道遇到一个红色的或蓝色的,然后以同样的方法进行扫描.

然而这种方法不易实现,编程复杂度过高,可以简化一下,可以开两个布尔数组,设为r和b,如果是红色r[i]就设为TRUE,如果是蓝色b[i]就设为true,如果是白色,两个都设为true,然后分四种情况,向左以红色扫描,向左以蓝色扫描,然后取其最大值,再向右以红色扫描,向右以蓝色扫描,然后取两个的最大值,最后两个最大值相加作为此点断开时的最大珠子数目.储存开,组后找到最大的数目打印即可.

【参考程序】

var
a:array[1..350] of record
red:boolean;
blue:boolean;
next,back,brake:integer;
end;
n,b,hrz,hbz,hz,hry,hby,hy,max,t:integer;
s:char;
procedure pc(x:integer);
begin
if x=n then begin writeln(n); halt;end;
end;
begin
readln(n);
for b:=1 to n do begin
read(s);
if s='b' then a[b].blue:=true else
if s='r' then a[b].red:=true else
begin
a[b].blue:=true;
a[b].red:=true;
end;
a[b].next:=b+1;
a[b].back:=b-1;
end;
a[n].next:=1;
a[1].back:=n;
for b:=1 to n do begin
t:=a[b].back;
hrz:=0;
while a[t].red=true do begin
t:=a[t].back;
inc(hrz);
pc(hrz);
end;
t:=a[b].back;
hbz:=0;
while a[t].blue=true do begin
t:=a[t].back;
inc(hbz);
pc(hrz);
end;
if hrz>hbz then hz:=hrz else hz:=hbz;
t:=b;
hry:=0;
while a[t].red=true do begin
t:=a[t].next;
inc(hry);
pc(hrz);
end;
t:=b;
hby:=0;
while a[t].blue=true do begin
t:=a[t].next;
inc(hby);
pc(hrz);
end;
if hry>hby then hy:=hry else hy:=hby;
if maxn then writeln(n) else writeln(max);
end.