数独杀手

数独杀手(math.c/cpp/pas)
【题目大意】
用程序解出数独,按要求输出即可。
【输入数据】
要求完成的数独,未填处为 0。
【输出数据】
输出完成后数独。
【输入样例】
2 7 6 0 0 0 0 8 0
3 0 0 8 0 0 0 1 5
5 0 0 2 0 9 7 0 0
0 8 2 3 0 0 4 0 0
0 0 0 0 5 0 0 0 0
0 0 1 0 0 4 3 6 0
0 0 4 5 0 8 0 0 7
1 6 0 0 0 3 0 0 4
0 3 0 0 0 0 5 2 1
【输出样例】
2 7 6 1 4 5 9 8 3
3 4 9 8 6 7 2 1 5
5 1 8 2 3 9 7 4 6
6 8 2 3 7 1 4 5 9

4 9 3 6 5 2 1 7 8

7 5 1 9 8 4 3 6 2

9 2 4 5 1 8 6 3 7
1 6 5 7 2 3 8 9 4
8 3 7 4 9 6 5 2 1

------------------------

传说中的码农题?(因为halt前没写close导致标准输出比我的输出长,惨痛教训!!!)

type
  c=array[1..9]of boolean;
var
  a:array[1..9,1..9]of longint;
  b:array[1..9,1..9]of boolean;
  ok:c;
  o:array[1..81]of record i,j:longint; end;
  i,j,num,ci,cj:longint;
procedure dfs(d:longint;ok:c);
var i,j,k,x,y:longint;
begin
  if d=num+1 then
    begin
      for i:=1 to 9 do
        begin
          for j:=1 to 9 do write(a[i,j],' ');
          writeln;
        end;
      halt;
    end;
  x:=o[d].i;  y:=o[d].j;
  for i:=1 to 9 do ok[i]:=true;
  for j:=1 to 9 do if (b[x,j])then ok[a[x,j]]:=false;//行和列
  for i:=1 to 9 do if (b[i,y])then ok[a[i,y]]:=false; 
  ci:=((x-1) div 3)*3+1;   cj:=((y-1) div 3)*3+1;  //九宫格
  for i:=ci to ci+2 do
    for j:=cj to cj+2 do if (b[i,j]) then ok[a[i,j]]:=false;
  for k:=1 to 9 do
    if ok[k] then
    begin
      a[x,y]:=k;

      b[x,y]:=true;
      dfs(d+1,ok);
      b[x,y]:=false;
    end;
end;
begin
  assign(input,'math.in');  assign(output,'math.out');
  reset(input);  rewrite(output);
  for i:=1 to 9 do
    for j:=1 to 9 do
      begin
        b[i,j]:=true;
        read(a[i,j]);
        if a[i,j]=0 then
          begin
            b[i,j]:=false;
            inc(num);
            o[num].i:=i;  o[num].j:=j;
          end;
      end;
  dfs(1,ok);
  close(input);  close(output);
end.
原文地址:https://www.cnblogs.com/zjhl2/p/3855987.html