回 帖 发 新 帖 刷新版面

主题:请各位帮个忙~鄙人新手

刚学了没几天,但是被迫要参加NOIP,所以请各位高手们帮帮忙
1、请问有什么比较好用的书吗?因为我们只发了部分讲义,例子基本没有,很难懂
2、问几个问题
(1)
  for i:=1 to n do
    for j:=1 to n do a[i,j]:='  ';
  for i:=1 to m do
    for j:=i to n+1-i do
    begin
      x:=copy(st,j,1);
      a[i,j]:=x;
      a[n+1-i,n+1-j]:=x;
    end;
中的copy是什么意思?

(2)
program project33;
var
  a:array[1..10] of integer;
  s,n,m:longint;
  flag:set of byte;
  
procedure try1(dep:integer);
var
  i:integer;
begin
  for i:=1 to n do
  if not(i in flag) then
  begin
    flag:=flag+[i];
    a[dep]:=i;
    if dep=m
    then inc(s)
    else  try1(dep+1);
    flag:=flag-[i];
  end;
end;

begin
  writeln('please  input  M and N:');
  readln(m,n);
  flag:=[ ];
  s:=0;
  try1(1);
  writeln(s);
end.   
这个程序是做什么的?
ps:老师让我们读程序写结果,但是要些分析过程,这个实在是没看懂,拜托各位了

回复列表 (共5个回复)

沙发

第二个:读入m和n,意思是求在1到n这n个数中选m个的种类,类似于排列组合。。
copy(st,i,j):在字符串st中的第i位拷贝j个字符下来,返回此串。

板凳

要分析过程吗?

3 楼

program project33;
var
  a:array[1..10] of integer;            {长度为10的数组}
  s,n,m:longint;                   {长整型}
  flag:set of byte;                 {集合类型}
  
procedure try1(dep:integer);
var
  i:integer;
begin
  for i:=1 to n do
  if not(i in flag) then              {如果i未取}
  begin
    flag:=flag+[i];              {取i}
    a[dep]:=i;                   {存放第i个数}
    if dep=m                    {若已取够m个数则种数加1}
    then inc(s)
    else  try1(dep+1);             {否则继续取}
    flag:=flag-[i];                {回溯,便于取下一个}
  end;
end;

begin
  writeln('please  input  M and N:');
  readln(m,n);                {读入}
  flag:=[ ];                  {置选择的数为空}
  s:=0;                       {累加种数}
  try1(1);                    {递归求解}
  writeln(s);                  {输出种数}
end.

4 楼

PS下:第一个是做什么的??

5 楼

我都不知道……正郁闷着呢

我来回复

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