码迷,mamicode.com
首页 > 其他好文 > 详细

1.15 构造数独

时间:2014-10-17 16:59:01      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   for   sp   文件   2014   on   cti   

(一)

用回溯法构造数独

#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdio>
#include <cstdlib>
using namespace std;

int sudu[9][9];

void sudu_print(int sudu[][9]) {
    for(int i = 0; i < 9; ++i) {
        for(int j = 0; j < 9; ++j) {
            cout << " " << sudu[i][j];
        }
        cout << endl;
    };
}

bool is_digital_sudu(int sudu[][9], int i, int j) {
    for(int k = 0; k < 9; ++k) {
        if(k == j) continue;
        if(sudu[i][k] == sudu[i][j]) return false;
    }
    for(int k = 0; k < 9; ++k) {
        if(k == i) continue;
        if(sudu[k][j] == sudu[i][j]) return false;
    }
    int p = i / 3;
    int q = j / 3;
    for(int m = 3 * p; m < 3 * p + 3; ++m) {
        for(int n = 3 * q; n < 3 * q + 3; ++n) 
            if(m != i && n != j && sudu[m][n] == sudu[i][j]) return false;
    }
    return true;
}

int main() {
    srand(time(0));
    memset(sudu, 0, sizeof(sudu));
    for(int i = 0; i < 9; ++i) {
        int temp = rand() % 81;
        sudu[temp/9][temp%9] = i + 1;
    }
    int k = 0;
    while(1) {
        int x = k / 9;
        int y = k % 9;
        while(1) {
            sudu[x][y]++;
            if(sudu[x][y] == 10) {
                sudu[x][y] = 0;
                --k;
                break;
            }else if(is_digital_sudu(sudu, x, y)) {
                k++;
                break;
            }
        }
        if(81 == k) {
            sudu_print(sudu);
            return 0;
        }
    }
    return 0;
}

在LINUX下执行的话,先执行命令:g++ 文件名.cpp   然后如果程序没有错误的话,那么在该目录下面会自动生成一个文件:.out。所以这个时候继续在该目录下执行:

./a.out

 

(二)

利用书上的置换的方法,简单。。。。。。

1.15 构造数独

标签:blog   io   os   for   sp   文件   2014   on   cti   

原文地址:http://blog.csdn.net/u010470972/article/details/40187307

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!