蓝桥杯,关于数独的递归思路解决问题

第一次写,就是一个大致思路。最近在看蓝桥杯的一些题,个人是属于菜鸟级别。是看了下面链接的博主的代码后受到的启发。
// test.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;

int  a[81]={
    0,0,5,3,0,0,0,0,0,
    8,0,0,0,0,0,0,2,0,
    0,7,0,0,1,0,5,0,0,
    4,0,0,0,0,5,3,0,0,
    0,1,0,0,7,0,0,0,6,
    0,0,3,2,0,0,0,8,0,
    0,6,0,5,0,0,0,0,9,
    0,0,4,0,0,0,0,3,0,
    0,0,0,0,0,9,7,0,0
};


//行列是否有相同的数,k为值,index为当前的数组索引
bool hang_lie(int k,int index){
int ai=index/9;//一维数组的某个值所在的行
int aj=index%9;//所在的列

for(int i=0;i<9;i++)
if(a[(ai)*9+i]==k)
return true;
for(int j=0;j<9;j++)
if(a[9*j+aj]==k)
return true;
return false;
}


//判断当前的小方格是否有相同的数,有9个小方格嘛,要保证每个小方格的数据唯一,进行判断。
bool fangge(int k,int index){
int ai=(index/9)/3;
int aj=(index%9)/3;
int center=ai*27+9+aj*3+1;//每个小方格都有一个中心的值,这是中心值对应的数组索引
if(a[center]==k || a[center+1]==k || a[center-1]==k || a[center-9]==k || a[center+9]==k || a[center-9-1]==k || a[center-9+1]==k || a[center+9-1]==k || a[center+9+1]==k)
return true;
else
return false;
}


//开始递归
bool istrue(int n){
if(n>=81) return 1;
while(a[n]!=0)n++;//已经有值的不能继续修改,需要跳过


for(int j=1;j<=9;j++)//用9个数字进行试,满足的才能用
{

if(hang_lie(j,n)==false && fangge(j,n)==false){
          a[n]=j;
          if(istrue(n+1))return 1;
          a[n]=0;//n+1的时候返回的0,说明需要修改n的情况。
}
}


return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{

    istrue(0);
    for(int i=0;i<81;i++)
   {
         if(i%9==0)cout<<endl;
         cout<<a[i]<<" ";
   }

   return 0;
}

主要是担心电脑重装系统后我的代码又没了,一些小技巧也不适合放在github上面,所以用博客的方式来保存吧哈哈


这是运行之后的截图



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值