1. “高效”排序
以下程序实现输入n个数,使用类似冒泡排序的方法,依次比较相邻的两个数,如果前一个数比后一个大,则交换两者,最终将输入的n个数从小到大排序后输出。程序在运行中发现某遍扫描后,没有数据交换发生,说明已经有序了,此时将退出扫描。请将程序补充完整。
program nbcz09_5;
var n,i,j,tmp:longint;
a:array[1..10000]of longint;
flag:boolean; //flag=true表示有交换发生,flag=false表示没有交换
begin
readln(n);
for i:=1 to n do read(a[i]);
i:=1;
_______flag:=true______;
while flag and (i<=n-1) do begin
flag:=false;
for j:=1 to _____n-i______ do
if a[j]>a[j+1] then begin //前一个比后一个大
tmp:=a[j];
___a[j]:=a[j+1]__;
a[j+1]:=tmp;
__flag:=true_____;
end;
_____inc(i)______;
end;
for i:=1 to n-1 do write(a[i],' ');
writeln(a[n]);
end.
2. 数独游戏
在n行n列的方格中,每个格子填入一个1~n之间的数字,使得每行中没有重复数字,每列上也没有重复数字。如图1所示是一个3行3列的合法的安排方案。
游戏开始可以规定某些格子已经有给定的数字。如图2所示,在2行2列的方格中,规定1行1列和2行2列的数字均为1,则得到唯一的如图3所示的方案。但如果规定1行1列数字为1,2行2列数字为2,则无法得到任何合法的方案(如图4所示)
下面的程序求9行9列的一个安排方案,程序首先读入若干个已知格子上的数字,找到一个合理的安排方案后输出。如果没有任何合法方案,则输出“No Solution!”(注意引号不用输出)。
程序填充格子的次序依次为:1行1列、1行2列、…1行9列、2行1列、2行2列、…2行9列、…9行1列、9行2列、…9行9列。
请你将空白处的程序补充完整。
program nbxx09_6;
var h:array[1..9,1..9]of boolean;//h[i,j]表示数字j是否出现在第i行
v:array[1..9,1..9]of boolean; //v[i,j]表示数字j是否出现在第i列
change:array[1..9,1..9]of boolean;//change[i,j]表示第i行第j列是否为规定的数字
a:array[1..9,1..9]of integer;//保存方案
i,j,k,n,x:integer;
procedure print;//输出找到的方案
var i,j:integer;
begin
for i:=1 to 9 do begin
for j:=1 to 8 do write(a[i,j],);
writeln(____a[i,9]______);
end;
end;
procedure search(i,j:integer); //从i行j列开始填充
var k:integer;
begin
if (______i=10_______) then begin
print;
halt; //结束程序
end;
if change[i,j] then begin
for k:=1 to 9 do
if (not h[i,k]) and(not v[j,k]) then begin
h[i,k]:=true;
v[j,k]:=true;
_____a[i,j]:=k_______;
if j<9 then search(i,j+1)
else search(______i+1,1_______);
h[i,k]:=false;
v[j,k]:=false;
end
end
else begin
if j<9 then search(i,j+1)
else search(_____i+1,1_________);
end;
end;
begin
for i:=1 to 9 do
for j:=1 to 9 do begin
h[i,j]:=false; //第i行没有数字j出现
v[i,j]:=false; //第i列没有数字j出现
a[i,j]:=0; //第i行第j列没有数字填入
change[i,j]:=true; //第i行第j列允许填充(没有给定的输入数字)
end;
readln(n);
for k:=1 to n do begin
readln(i,j,x);
a[i,j]:=x; //第i行第j列给定的数字为x
h[i,x]:=true; //第i行出现数字x
v[j,x]:=true; //第j列出现数字x
change[i,j]:=false; //第i行第j列不允许填充(已有给定的输入数字)
end;
search(____1,1______);
writeln(___'No Solution!'______);
end.