九宫格算法实现(C语言版本)
环境:VS2008下调试通过,以0表示需要填的数字,用回溯法进行“蛮算”
#include "stdafx.h" #include <iostream> using namespace std; static int pu[9][9]= { {0,8,0,0,0,3,0,9,0}, {0,0,7,6,4,0,0,5,0}, {3,2,0,0,0,7,4,6,0}, {0,4,0,0,0,1,0,3,0}, {2,0,3,0,0,6,8,0,1}, {0,5,0,7,0,9,0,4,0}, {0,7,1,3,0,0,0,8,9}, {0,3,0,0,1,4,7,0,0}, {0,6,0,9,0,0,0,1,0} }; int isvalid(const int i, const int j)//验证函数当期i,j坐标是否符合游戏规则,不重复 { const int n = pu[i][j]; const static int query[] = {0, 0, 0, 3, 3, 3, 6, 6, 6}; int t, u; for (t = 0; t < 9; t++) if ((t != i && pu[t][j] == n) || (t != j && pu[i][t] == n))//0-9的数字,每行每列都不能重复 return 0; for (t = query[i]; t < query[i] + 3; t++) //9个宫的3×3里也不能重复 for (u = query[j]; u < query[j] + 3; u++) if ((t != i || u != j) && pu[t][u] == n) return 0; return 1; } void output(void)//输入函数 { static int n; cout << "Solution " << ++n << " : " < < e n d l; f or(int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) cout<< pu[i][j] << " "; cout << endl; } cout << endl; } void Try(const int n)//核心函数,回溯算法 { if (n == 81) { //是否已经是最后一个格子 output(); return; } const int i = n / 9, j = n % 9; if (pu[i][j] != 0) { //如果当前格子不需要填数字,就跳到下一个格子 Try(n + 1); return; } for (int k = 0; k < 9; k++) { pu[i][j]++;//当前格子进行尝试所有解 if (isvalid(i, j)) { Try(n + 1);//验证通过,就继续下一个 //output(); } } pu[i][j] = 0; //如果上面的单元无解,就回溯 } int main(void) { int temp; Try(0); cin>>temp; }