回 帖 发 新 帖 刷新版面

主题:1995复赛题求助!!!

第二题 方阵填数

在一个N×N的方阵中,填入1,2,……N×N个数,并要求构成如下的格式:
例:
      N=5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9  8  7  6  5
       N=6
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9  8  7  6


第三题

  若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数成为A类数,否则就称其为B类数。
  例如:(13)10=(1101)2
  其中1的个数为3,0的个数为1,则称此数为A类数;     (10)10=(1010)2
  其中1的个数为2,0的个数也为2,称此数为B类数;     (24)10=(11000)2
  其中1的个数为2,0的个数为3,则称此数为B类数;
  程序要求,求出1~1000之中(包括1与1000),全部A、B两类数的个数。


第四题 编码问题

  设有一个数组A:ARRAY[0..N-1] OF INTEGER;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i≠j时)。
  例如:N=6时,A=(4,3,0,5,1,2)
  此时,数组A的编码定义如下:
    A[0]的编码为0;
    A[i]的编码为:在A[0],A[1],…A[i-1]中比A[i]的值小的个数(i=1,2,…,N-1)
    所以上面数组A的编码为:B=(0,0,0,3,1,2)
  程序要求解决以下问题:
  ①给出数组A后,求出其编码;
  ②给出数组A的编码后,求出A中的原数据。


第五题 灯的排列问题

  设在一排上有N个格子(N≤20),在格子中放置有不同颜色的灯,每种灯的个数计为N1,N2,…Np(p表示不同颜色灯的个数)。
  放灯时要遵守下列规则:
  ①同一种颜色的灯不能分开;
  ②不同颜色的灯之间至少要有一个空位置。
    例如:N=8(格子数)
       R=2(红灯数)
       B=3(蓝灯数)
  放置的方法有:
  R-B顺序
R R   B B B    
R R     B B B  
R R       B B B
  R R   B B B  
  R R     B B B
    R R   B B B

  B-R顺序
B B B   R R    
B B B     R R  
B B B       R R
  B B B   R R  
  B B B     R R
    B B B   R R

  放置的方式为12种。
  数据输入的方式为:
    N
    P1(颜色,为一个字母) N1(灯的数量)
    P2           N2
     ……
    Q(结束标记,Q本身不是灯的颜色)
  程序要求:求出一种顺序的排列方案及排列总数。

回复列表 (共4个回复)

沙发

第二题 方阵填数

program Fill_Array;
{$B-}
const    MaxN=100;
var
   a:array[1..MaxN,1..MaxN] of integer;
   x,y,direc,N,M:integer;
begin
   write('Enter N: '); readln(N);
   if (N<=0) or (N>MaxN) then exit;
   for y:=1 to N do
     for x:=1 to N do
        a[x,y]:=0;

   direc:=0;  x:=N;  y:=0; M:=0;
   repeat
      case direc of
       0:   if (y+1>N) or (a[x,y+1]<>0) then
              begin
                 direc:=(direc+1) mod 4;
                 continue;
              end
             else y:=y+1;
       1:   if (x-1<=0) or (a[x-1,y]<>0) then
              begin
                 direc:=(direc+1) mod 4;
                 continue;
              end
             else x:=x-1;
       2:   if (y-1<=0) or (a[x,y-1]<>0) then
              begin
                 direc:=(direc+1) mod 4;
                 continue;
              end
             else y:=y-1;
       3:   if (x+1>N) or (a[x+1,y]<>0) then
              begin
                 direc:=(direc+1) mod 4;
                 continue;
              end
             else x:=x+1;
       end;
       M:=M+1;
       a[x,y]:=M;
   until M=N*N;

   for y:=1 to N do
     begin
        for x:=1 to N do
             write(a[x,y]:4);
        writeln;
     end;
end.

第三题 求出1~1000之中(包括1与1000),全部A、B两类数的个数。

program Calc_AB_Type;
var
   i,A,B:integer;

function TypeA(n:integer):boolean;
var
   sum1,sum0: integer;
begin
  if n<0 then exit;
  sum1:=0; sum0:=0;
  repeat
     if (n and 1) = 1 then  sum1:=sum1+1
       else   sum0:=sum0+1;
      n:=n shr 1;
  until n=0;
  if sum1>sum0 then TypeA:=true
    else  TypeA:=false;
end;

begin
    A:=0; B:=0;
    for i:=1 to 1000 do
       if TypeA(i) then A:=A+1
         else B:=B+1;
    writeln('A=',A:4,' B=',B:4);
end.

其它两题还没看。

板凳

第四题 编码问题
program encode_decode;
const  MaxN=100;
var
   a,b,temp:array[0..MaxN-1] of integer;
   i,N,select:integer;

procedure prn;
var
   i:integer;
begin
  for i:=0 to n-1 do write(b[i]:4);
  writeln;
end;


procedure encode;
var
    i,j,m:integer;
begin
    b[0]:=0;
    for i:=1 to N-1 do
      begin
         m:=0;
         for j:=0 to i-1 do if a[j]<a[i] then  m:=m+1;
         b[i]:=m ;
      end;
end;

procedure decode;
var
    i,j,sum:integer;

begin
    for i:=0 to N-1 do temp[i]:=i;
    for i:=N-1 downto 0 do
      begin
          b[i]:=temp[a[i]];
          for j:=a[i] to N-2 do temp[j]:=temp[j+1];
      end;
end;

begin
  repeat
      writeln;
      writeln('1:  Encode');
      writeln('2:  Decode');
      writeln('3:  Quit');
      write('Enter select:');
      readln(select);

      case  select of
      1:    begin
              write('Encode:   Enter N= '); readln(N);
              if (N<1) or (N>MaxN) then continue;
              write('Enter array to encode: ');
              for i:=0 to N-1 do read(a[i]);
              encode;
              prn;
            end;
      2:    begin
              write('Decode:   Enter N= '); readln(N);
              if (N<1) or (N>MaxN) then continue;
              write('Enter array to decode: ');
              for i:=0 to N-1 do read(a[i]);
              decode;
              prn;
            end;
       end;
  until select=3;
end.

3 楼

你可以到书店买一本
[fly]《全国青少年信息学(计算机)奥林匹克分区联赛试题解析(中学)》[/fly]
这上面题目很全!

4 楼

program e2;
const
   w:array[1..4,1..2]of integer
    =((1,0),(0,-1),(-1,0),(0,1));
var
   a:array [0..20,0..20]of integer;
   n,l,t,i,j,x,y,p:integer;
begin
  repeat
    readln(n);
  until (n<20) and (n>1);
  p:=2;
  if n>3 then p:=p+1;
  if n>9 then p:=p+1;
  l:=1;
  x:=1;y:=n;
  t:=1;
  for i:=1 to n do begin
    a[0,i]:=-1;
    a[i,0]:=-1;
    a[i,n+1]:=-1;
    a[n+1,i]:=-1;
  end;
  repeat
    a[x,y]:=l;
    l:=l+1;
    if a[x+w[t,1],y+w[t,2]]<>0 then t:=t+1;
    if t=5 then t:=1;
    x:=x+w[t,1];
    y:=y+w[t,2];
  until l>n*n;
  for i:=1 to n do begin
   for j:=1 to n do
     write(a[j,n-i+1]:p);
   writeln;
   writeln;
  end;
  readln;
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册