数独杀手(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.
时间: 2024-12-19 03:26:43