poj 2676 Sudoku

来源:互联网 发布:java接口管理系统 编辑:程序博客网 时间:2024/05/18 21:41

题意:填写数独中所缺的。

方法:深搜

代码:

#include <iostream>#include <cstdio>#define N 9using namespace std;int a[N][N];bool flag;bool judge(int hang, int lie, int val){      int h = hang/3, l = lie/3;      for (int i=h*3; i<h*3+3; i++)//保证数字所在的9个格子没有数相同            for (int j=l*3; j<l*3+3; j++)                  if (a[i][j] == val && a[i][j]!=0)                        return false;      for (int i=0; i<N; i++)//保证数字所在的行没有数相同            if (a[hang][i] == val && a[hang][i]!=0)                  return false;      for (int i=0; i<N; i++)//保证数字所在的列没有数相同            if (a[i][lie] == val && a[i][lie]!=0)                  return false;      return true;}void dfs(int n){      int hang = n/9, lie = n%9;      if (n==81)      {            flag = true;            return ;      }      if (a[hang][lie] != 0)            dfs(n+1);      else      {            for (int i=9; i>=1 && !flag; i--)                  if (judge(hang, lie, i))                  {                        a[hang][lie] = i;                        dfs(n+1);                  }            if (!flag)//当已经找到数独的时候不在回溯                  a[hang][lie] = 0;      }}int main(){      int n;      char c, temp;      scanf("%d", &n);      getchar();      while (n--)      {            for (int i=0; i<N; i++)            {                  for (int j=0; j<N; j++)                   {                         scanf("%c", &c);                         a[i][j]=c-'0';                   }                  scanf("%c",&temp);            }            flag = false;            dfs(0);            for (int i=0; i<N; i++)            {                  for (int j=0; j<N; j++)                        printf("%d", a[i][j]);                  printf("\n");            }      }      return 0;}