首页 > 代码库 > 数独杀手

数独杀手

数独杀手(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.