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

题目解答

题目:
数独游戏
在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.
考点:
分析:
解答:
评论:
老师: