不是VIP会员,不能显示答案

题目解答

题目:
【跳棋数】(3+3+3+3+3+3=18分)
跳棋是大家都熟悉的棋类活动,就是一颗棋子可以通过相邻的另一颗棋子笔直地跳到另一颗棋子相邻的空位上去。在一串很长的由数字组成的字符串中,如果某个位数为k的数值和间隔k个位置后面的位数为k的数值相等,就称为跳棋数。
比如对于字符串131313,如果规定k为1,则三个1构成了跳棋数,从第一个1开始开始跳,最多可以跳2步;从第二个位数为k的数值3开始,也构成了跳棋数,最多也可以跳2步。又如,1223122312341223,如果规定k为2,则从字符串的第一个k位数值“12”开始,组成的跳棋数的最多可以跳的步数是3(每步到达的目的地如上面下划线“__”所示),而第二个k位数值“23”开始的跳棋数最多可以跳的步数是1(每步到达的目的地如上面下划线“ ”所示)。也就是说,如果规定了k,则作为“棋子”的数值就是k位,而每次“跳棋”时必须跳过右面相邻的k个位置。
下列程序先从键盘输入k的值,然后会输入一个由数字组成的字符串(只包含0、1、…、9这些数字),而且规定,这个字符串的长度肯定是2*k的倍数。通过处理,程序最后能输出二个整数,分别表示字符串中第一个位数为k的数值开始的跳棋数最多能跳的步数和第二个位数为k的数值开始的跳棋数最多能跳的步数。请完善程序。
【知识链接】
1.t:string定义了一个字符串类型变量,s可以存储一串字符,每个字符分别存入对应的下表变量s[1]、s[2]、……中,最多可以保存255个字符。
2. t1:=copy(s,i,k)中copy( )是一个系统函数,作用是把保存在字符串变量s中的字符串从第i个位置开始复制k个,然后返回复制所得的字符串(本语句中是赋值给变量t1。
3.val(t1,a[i1],e)中val( )是一个系统过程,它能把保存在t1中的由数字组成的字符串转换成对应的数值(产生的数值可以进行四则运算),然后把数值保存到下标变量a[i1]中。比如,如果t1的值是字符串“2”,则调用val( )后a[i1]的值就是数值2。
4.length(s)是一个系统函数,作用是计算并返回保存在字符串变量s中的字符串的长度(字符个数)。
【样例输入】
3
123234123234123235123234
【样例输出】
3 1
program test06;
const maxn=200;
var
 x1,x2,i,j,k,n:integer;
 a:array[1..100] of integer;
 b:array[1..100] of integer;
 s:string;
procedure check(k:integer);
var
 i,j,i1,j1,e:integer;
 t1,t2:string;
begin
 i:=1;i1:=  0  ;j1:=0;x1:=  0  ;x2:=0;
 while i+2*k-1<=n do
 begin
  t1:=copy(s,i,k);i1:=i1+1;val(t1,a[i1],e);i:=i+k;
  t2:=copy(s,i,k);j1:=j1+1;val(t2,b[j1],e);i:=i+k;
 end;
 i:=1;
 while (  a[i]=a[i+1]  ) and (i<i1) do
 begin x1:=  x1+1  ;i:=i+1;end;
 j:=1;
 while (  b[j]=b[j+1]  ) and (j<j1) do
 begin x2:= x2+1  ;j:=j+1;end;
end;
begin    {main}
 readln(k);
 readln(s);n:=length(s);
 check(k);
 writeln(x1,' ',x2);
end.
考点:
分析:
解答:
评论:
老师: