我这个'火星人'程序哪里错了?为什么显示范围超出?(错误201,PASCAL)

来源:百度知道 编辑:UC知道 时间:2024/05/08 17:29:12
program quanpailie;
var n,i,add,m:integer;
a,st:array[1..1000] of integer;
vis:array[1..1000] of boolean;
procedure search(depth:integer);
var i:integer;bool:boolean;
begin
if (depth>n) then
begin
k:=k+1;
bool:=true;
for i:=1 to n do
if st[i]<>a[i] then begin bool:=false;break;end;
if bool=true then m:=k+add;
if k=m then begin
for i:=1 to n do write(a[i],' ');halt;end;
exit;
end;
for i:=1 to n do
if not vis[i] then
begin
a[depth]:=i;
vis[i]:=true;
search(depth+1);
vis[i]:=false;
end;
end;
begin
readln(n);
readln(add);
for i:=1 to n do
read(st[i]);
k:=0;
fillchar(vis,sizeof(vis),false);<

看不懂,不过我肯定你这样用全排列保证超时.(你那个可能是数组太小了)
这是我几天前编的,对了九个测试点,最后一个超时(最后一个数据太大了)
希望对你有帮助,祝你明天考出好成绩
Program t;
Var a:array [1..10001] of integer;
n,m,i,j,k:integer;
flag:boolean;
Begin
assign(input,'martian.in');reset(input);
assign(output,'martian.out');rewrite(output);
readln(n);
readln(m);
for i:=1 to n do
read(a[i]);
j:=n;
i:=0;
repeat
repeat
if a[j]<n then
repeat
a[j]:=a[j]+1;
flag:=true;
k:=j;
while (flag) and (k>=1) do
begin
k:=k-1;
if a[k]=a[j] then flag:=false;
end;
until (flag) or (a[j]=n);
if (a[j]=n) and (not flag) then j:=j-1;
if (flag) then begin j:=j+1;a[j]:=0;end;
until (j=n) and (flag);
i:=i+1;