• 数独游戏


    你一定听说过“数独”游戏。
    如下图所示,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
    数独的答案都是唯一的,所以,多个解也称为无解。
    本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。
    本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。
    格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。
    输出9行,每行9个数字表示数独的解。

    例如:
    输入(即图中题目):
    005300000
    800000020
    070010500
    400005300
    010070006
    003200080
    060500009
    004000030
    000009700

    程序应该输出:
    145327698
    839654127
    672918543
    496185372
    218473956
    753296481
    367542819
    984761235
    521839764

    再例如,输入:
    800000000
    003600000
    070090200
    050007000
    000045700
    000100030
    001000068
    008500010
    090000400

    程序应该输出:
    812753649
    943682175
    675491283
    154237896
    369845721
    287169534
    521974368
    438526917

    796318452


    #include <stdio.h>
    
    int a[9][9];
    
    int place(int x, int y)
    {
        // 用来表示每个小正方行组的坐标范围
        int up, down, left, right;
        up = x / 3 *3;
        down = up + 3;
        left = y / 3 * 3;
        right = left + 3;
        
        // 分三种情况判断: 行, 列, 小正方形组
        // 1.判断行
        for (int i = 0; i < 9; i++) {
            if (a[x][y] == a[x][i] && y != i) {
                return 0;
            }
        }
        
        // 判断列
        for (int i = 0; i < 9; i++) {
            if (a[x][y] == a[i][y] && x != i) {
                return 0;
            }
        }
        
        // 判断a[x][y]所在小正方形组
        for (int i = up; i < down; i++) {
            for (int j = left; j < right; j++) {
                if (a[x][y] == a[i][j] && x != i && y != j ) {
                    return 0;
                }
            }
        }
        
        return 1;
    }
    
    void backtrack(int t)
    {
        if (t == 81)
        {
            printf("=============================
    ");
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    printf("%d",a[i][j]);
                }
                printf("
    ");
            }
        }
        else
        {
            int x = t / 9; // 行
            int y = t % 9; // 列
            if (a[x][y] != 0)
            {
                backtrack(t+1);
            }
            else
            {
                for (int i = 1; i <= 9; i++) {
                    a[x][y] = i;
                    if (place(x, y)) {
                        backtrack(t+1);
                    }
                    a[x][y] = 0;
                }
            }
        }
    }
    
    int main(int argc, const char * argv[])
    {
        // 初始化
        char str[9][9];
        printf("请输入数据(0代表空白):
    ");
        for (int i = 0; i < 9; i++) {
            gets(str[i]);
        }
        
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                a[i][j] = str[i][j] - '0';
            }
        }
        
        backtrack(0);
        
        return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    rsyslog 只读取变化的日志
    Invalid component element. Instead of passing a string like 'div', pass React.createElement('div')
    Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore
    JUC (Java Util Concurrency) 基础内容概述
    浅析Java中CountDownLatch用法
    java 多线程 CountDownLatch用法
    基于Netty的“请求-响应”同步通信机制实现
    响应头location 页面跳转
    8.1 Optimization Overview
    论人不地道,我只佩服TT——北漂18年(68)
  • 原文地址:https://www.cnblogs.com/liuqblog/p/4948155.html
Copyright © 2020-2023  润新知