计蒜客 2018蓝桥模拟赛(一) 数独

数独
蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?
标准数独是由一个给与了提示数字的 9 \times 99×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3 \times 33×3 宫都没有重复的数字出现。

数独
输出这个数独得正解,输出格式如下:

* 2 6 * * * * * *
* * * 5 * 2 * * 4
* * * 1 * * * * 7
* 3 * * 2 * 1 8 *
* * * 3 * 9 * * *
* 5 4 * 1 * * 7 *
5 * * * * 1 * * *
6 * * 9 * 7 * * *
* * * * * * 7 5 *

把上面的 * 替换成 1 - 91−9 就可以了
提醒:两个数字之间要有一个空格,其他地方不要输出多余的符号。
本题答案不唯一,符合要求的答案均正确

思路:按数独的玩法,行列不能有重复的,每个小的九宫格中不能有重复的数字。剩下的讲解都在代码中。

#include<iostream>
using namespace std;
int mp[90][90];

int hs(int x , int y , int i){ //判断行和列中有没有重复出现的数字 
    for(int j = 0; j < 9; j++){
        if(mp[x][j] == i && y != j)//行 
          return 0; 
        if(mp[j][y] == i && j != x)//列 
          return 0; 
    }
    return 1; 
}

int jiu(int x, int y, int n){//判断九个3X3的矩阵中有没有重复的数字 
    int xx = x / 3;//判断3X3矩阵左上方元素的位置 
    int yy = y / 3;
    for(int i = xx * 3; i < xx * 3 + 3; i++)
      for(int j = yy * 3; j < yy * 3 + 3; j++){
        if(mp[i][j] == n)
          if(i == x && j == y) continue;
          else return 0;
      }
    return 1;   
}

bool dfs(int cen){
    if(cen >= 81) return 1;//搜索完毕 
    int x = cen / 9;//判断当前位置的行坐标 
    int y = cen % 9;//列坐标 
    if(!mp[x][y]){//搜索当前位置的元素 
        for(int i = 1; i < 10; i++){ 
            mp[x][y] = i;//填数 
            if(jiu(x,y,i) && hs(x,y,i))//如果行列不冲突 
              if(dfs(cen + 1))//搜索下一个,下一个也不冲突,返回true,表示填数完成 
               return true;
            mp[x][y] = 0;//回溯 
        }
    }
    else return dfs(cen +1);//如果已经填入数字,搜索下一个,这里的返回很有灵性。
    return false; 
}

int main(){
    for(int i = 0; i < 9; i++){//输入字符,转换数字矩阵 
        for(int j = 0; j < 9; j++){
         char a; 
         cin >> a;
         if(a <= '9' && a >= '1')
           mp[i][j] = a - '0';
         else mp[i][j] = 0; 
        }
    }
    cout << endl;
    dfs(0);//从第一个开始搜索 
      for(int i = 0; i < 9; i++){//打印 
        for(int j = 0; j < 9; j++)
          cout << mp[i][j] << " ";
        cout << endl; 
      }
    return 0;
}
/*需要输入的矩阵,输出的矩阵,自己输出看看吧~
*26******
***5*2**4
***1****7
*3**2*18*
***3*9***
*54*1**7*
5****1***
6**9*7***
******75*
*/ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值