m0_59342578 2021-10-20 19:58 采纳率: 0%
浏览 7
已结题

C++解数独运行时间的优化

以下是我的代码


#include<iostream>
using namespace std;
int num[9][9];
bool flag = false;
void Input() {
    int i, j;
    char ch;
    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9; j++) {
            cin >>ch;
            if(ch=='.') num[i][j]=0; 
            else num[i][j]=ch-'0';

        }
    }
}
bool Check(int n, int key) {
    int i, j;
    for (j = 0; j < 9; j++) {
        i = n / 9;
        if (num[i][j] == key) {
            return false;
        }
    }
    for (i = 0; i < 9; i++) {
        j = n % 9;
        if (num[i][j] == key) {
            return false;
        }
    }
    int x = n / 9 / 3 * 3;
    int y = n % 9 / 3 * 3;
    for (i = x; i < x + 3; i++) {
        for (j = y; j < y + 3; j++) {
            if (num[i][j] == key) {
                return false;
            }
        }
    }
    return true;
}

int DFS(int n) {
    if (n > 80) {
        flag = true;
        return 0;
    }
    if (num[n / 9][n % 9] != 0) { 
        DFS(n + 1);
    } 
    else {
        for (int i = 1; i <= 9; i++) {
            if (Check(n, i) == true) {
                num[n / 9][n % 9] = i;  
                DFS(n + 1);
                if (flag == true)
                    return 0;
                num[n / 9][n % 9] = 0;
            }
        }
    }
}

void Output() {
    cout << endl << "完成后的数独:" << endl;
    int i, j;
    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9; j++) {
            cout << num[i][j] << " ";
            if (j % 3 == 2) {
                cout << "  ";
            }
        }
        cout << endl;
        if (i % 3 == 2) {
            cout << endl;
        }
    }
}

void Output0(){
    cout << endl << "完成后的数独:" << endl;
    int i, j;
    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9; j++) {
            cout << num[i][j];
        }
    }
}

int main() {
    cout<<"请输入0或1指定输出格式,0为机器格式,1为自定格式"<<endl;
    int x;
    while(cin>>x){
        if(x==0){
            cout << "请输入一个9*9的数独,空位用.表示:" << endl;
            Input();
            DFS(0);
            Output0();
            return 0;}
        if(x==1){
            cout << "请输入一个9*9的数独,空位用.表示:" << endl;
            Input();
            DFS(0);
            Output();
            return 0;}
    }
    return 0;
}

在计算一个较难的例子时运行了十几秒,请问能在哪里进行优化让时间减少吗

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月28日
    • 创建了问题 10月20日

    悬赏问题

    • ¥15 12864只亮屏 不显示汉字
    • ¥20 三极管1000倍放大电路
    • ¥15 vscode报错如何解决
    • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
    • ¥15 python随机森林对两个excel表格读取,shap报错
    • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
    • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
    • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
    • ¥15 VFP如何使用阿里TTS实现文字转语音?
    • ¥100 需要跳转番茄畅听app的adb命令