8月4日总结

来源:互联网 发布:淘宝欧舒丹是正品吗 编辑:程序博客网 时间:2024/05/21 11:25

从今天早上开始做数独的题,一直做到下午五点,刚开始看到这个题的时候感觉没有地方下手,一点头绪也没有,因为每行每列每个宫格都不可以有重复的数组,而且必须有1-9这九个数,刚开始一看题就感觉这个题的要求太多了。

数独问题:

题目大意:9*9的方格使得每行中每列和每个标记的3x3子方格中不能有重复的数字并且有1-9的每个数。

代码:#include <iostream>
#include <cstring>
using namespace std;
char M[9][9];
int m[9][9],vx[10][10],vy[10][10],vg[10][10];
int i,j,n,flag;
void dfs(int x,int y);
int main()
{
    cin>>n;
    while(n--)
{
  for(i=0;i<9;i++)
  cin>>M[i];
  memset(vx,0,sizeof(vx));
  memset(vy,0,sizeof(vy));
  memset(vg,0,sizeof(vg));
  for(i=0;i<9;i++)
  for(j=0;j<9;j++)
  {
      m[i][j]=M[i][j]-'0';
      if(m[i][j])
      {
          vx[i][m[i][j]]=1;
          vy[j][m[i][j]]=1;
          int k = 3*(i/3)+j/3;
          vg[k][m[i][j]]=1;
      }
  }
  flag=0;
  dfs(0,0);
  }
  return 0;
}
void dfs(int x,int y)
{
    if(x==9)
    {
    flag=1;
        for(int i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            cout<<m[i][j];
            cout<<endl;
        }
        return ;
    }
     if(flag) return ;
    if(m[x][y])
    {
        if(y==8)
        dfs(x+1,0);
        else
        dfs(x,y+1);
    }
    else
    {
        for(int i=1;i<=9;i++)
        {
            int k = 3*(x/3)+y/3;
            if(vx[x][i]==0&&vy[y][i]==0&&vg[k][i]==0)
            {
                m[x][y]=i;
                vx[x][i]=1;
                vy[y][i]=1;
                vg[k][i]=1;
                if(y==8)
                dfs(x+1,0);
                else
                dfs(x,y+1);
                m[x][y]=0;
                vx[x][i]=0;
                vy[y][i]=0;
                vg[k][i]=0;


            }
        }
    }
}

解题思路:建立三个数组用来标记某行某列某宫格已经用过的数,先定义一个字符数组,把地图输进去之后用二重循环减去‘0’转换成int型数组,转换之后判断是否为0,若不为0则将这个数标记下来,然后进行搜索,利用循环找数,当这个数在行列宫格都没用过的时候符合要求,把这个数进行循环,当把9*9的格子全部遍历一遍后搜索结束。