| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1532 人关注过本帖
标题:一个数独题目,想用c写,但是没有思路,自己在纸上做都得半天,求大神指教! ...
只看楼主 加入收藏
花开半夏12
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-3-1
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
一个数独题目,想用c写,但是没有思路,自己在纸上做都得半天,求大神指教!
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 一个数 思路 
2018-03-01 17:41
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:10 
去了解一下"回溯"

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2018-03-01 19:21
will丶
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:117
专家分:443
注 册:2015-10-19
收藏
得分:10 
写了一个简单的,没考虑多解情况,希望有所帮助
程序代码:
#include <stdio.h>

// 寻找下一个未填充的单元
int findNextEmpty(int arr[9][9], int startRow, int *row, int *col)
{
    int i, j;

    for (i = startRow; i < 9; i++)
        for (j = 0; j < 9; j++)
            if (arr[i][j] == 0) {
                *row = i;
                *col = j;
                return 1;
            }

    return 0;
}

//按行输出
void print(int a[9][9])
{
    int i, j;

    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9; j++) {
            printf("%2d", a[i][j]);
            if (j == 8) printf("\n");
        }
    }
}

//检查是否重合
int resolve(int arr[9][9], int row, int col)
{
    int i, j, n;

    int nextRow, nextCol;

    n = 0;
    while (1) {
    nextNum:
        ++n;
        if (n >= 10) break;

        // 检测所在行重复
        for (j = 0; j < 9; j++) {
            if (arr[row][j] == n) {
                goto nextNum;
            }
        }

        // 检测所在列重复
        for (i = 0; i < 9; i++) {
            if (arr[i][col] == n) {
                goto nextNum;
            }
        }

        /* 检测所在小九宫格重复*/
        int x = (row / 3) * 3;
        int y = (col / 3) * 3;
        for (i = x; i < x + 3; i++) {
            for (j = y; j < y + 3; j++) {
                if (arr[i][j] == n) {
                    goto nextNum;
                }
            }
        }

        //该单元可以填入
        arr[row][col] = n;
        //如果9宫格已填满,完成,这里未考虑有多解的情况
        if (!findNextEmpty(arr, row, &nextRow, &nextCol)) {
            return 1;
        }
        //否则继续填下一个未填充的格子
        if (!resolve(arr, nextRow, nextCol)) {
            arr[row][col] = 0;
            continue;
        }
        else {
            return 1;
        }
    }

    return 0;
}

void resolveSudoku(int a[9][9])
{
    int row, col;

    findNextEmpty(a, 0, &row, &col);
    resolve(a, row, col);
}

int main(void)
{
    int a[9][9] = {
     9, 0, 0, 0, 5, 0, 0, 6, 0,
     0, 2, 0, 0, 7, 0, 1, 0, 0 ,
     3, 0, 0, 1, 0, 2, 0, 4, 0 ,
     7, 0, 3, 8, 0, 0, 5, 2, 9 ,
     0, 0, 0, 3, 4, 5, 0, 0, 0 ,
     5, 1, 6, 0, 0, 9, 4, 0, 3 ,
     0, 5, 0, 2, 0, 8, 0, 0, 6 ,
     0, 0, 7, 0, 9, 0, 0, 1, 0 ,
     0, 3, 0, 0, 1, 0, 0, 0, 4 
    };
    resolveSudoku(a);
    print(a);

    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2018-3-3 10:45编辑过]


腾空类星陨,遥望若花生。
2018-03-03 10:41
快速回复:一个数独题目,想用c写,但是没有思路,自己在纸上做都得半天,求大神 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040411 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved