回溯法解数独问题

来源:互联网 发布:mac 连接虚拟机ubuntu 编辑:程序博客网 时间:2024/06/06 05:20
#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<iostream>int map[9][9];void show(){for(int i=0;i<9;i++){for(int j=0;j<9;j++){printf("%d ",map[i][j]);}printf("\n");}}int isok(int x,int y,int n){int xx,yy,i,j;xx=x/3*3;yy=y/3*3;for(i=0;i<9;i++){if(map[x][i]==n||map[i][y]==n)return 0;}for(i=xx;i<xx+3;i++){for(j=yy;j<yy+3;j++){if(map[i][j]==n)return 0;}}return 1;}void fun(int x,int y){if(x>=9&&y==0){show();}else if(map[x][y]!=0){if(y+1==9) fun(x+1,0);elsefun(x,y+1);}else{//候选数方法 int n,m,i,j;int num[10];n=x/3*3;m=y/3*3;for(i=1;i<10;i++)//初始化数组 num[i]=0;for(i=0;i<9;i++){if(map[x][i]!=0)num[map[x][i]]=1;}for(i=0;i<9;i++){if(map[i][y]!=0)num[map[i][y]]=1;}for(i=n;i<n+3;i++){for(j=m;j<m+3;j++){if(map[i][j]!=0)num[map[i][j]]=1;}}for(i=1;i<=9;i++){if(num[i]==0){map[x][y]=i;if(y+1==9){fun(x+1,0);}else{fun(x,y+1);}map[x][y]=0;}/*if(isok(x,y,i)){//另一种方法 map[x][y]=i;if(y+1==9){fun(x+1,0);}else{fun(x,y+1);}map[x][y]=0;}*/}}}int main(){for(int i=0;i<9;i++){for(int j=0;j<9;j++){scanf("%1d",&map[i][j]);}}printf("\n");fun(0,0);return 0;} 


代码测试:



0 0
原创粉丝点击