首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数独算法分析

数独算法分析
EN

Stack Overflow用户
提问于 2013-01-22 19:33:18
回答 1查看 333关注 0票数 0

这是解数独(9x9)的代码:

代码语言:javascript
复制
#include <iostream>
#define dim 9
#define br_polja dim*dim

using namespace std;


bool Fsearch (int tab[dim][dim],int *x,int *y, int cand[dim], int *num_cand, int &free) {
int min=9; 
*x=-1;
*y=-1;
free=0;
for (int i=0;i<dim;i++) {
    for (int j=0;j<dim;j++) {

        if (tab[i][j]!=0) continue;
        free+=1;
        *num_cand=0;
        int cand_f[dim];
        for (int w=0;w<dim;w++)
            cand_f[w]=1;  

        int p,q; 
        p=i+3-(i%3); 
        q=j+3-(j%3);

        for (int w=p-3;w<p;w++) 
            for (int r=q-3;r<q;r++)
                if (tab[w][r]!=0){        
                                   cand_f[tab[w][r]-1]=0;
                                   }

        for (int w=0;w<dim;w++) { 
            if (tab[w][j]!=0) cand_f[tab[w][j]-1]=0; 
            if (tab[i][w]!=0) cand_f[tab[i][w]-1]=0;
            }

        for (int w=0;w<dim;w++)
            if (cand_f[w]!=0) 
               *num_cand+=1;


        if (*num_cand==1) { 
                                   *x=i;
                                   *y=j;
                                   int z=0;
                                   for (int w=0;w<dim;w++)
                                       if (cand_f[w]!=0) { 
                                          cand[z]=w+1;
                                          z++;
                                          }
                                   return true;
                                   }
        else if (*num_cand<min && *num_cand>0) {
                                     int z=0;
                                     for (int w=0;w<dim;w++)
                                         if (cand_f[w]!=0) { 
                                            cand[z]=w+1;
                                            z++;
                                            }
                                     min=*num_cand;
                                     *x=i;
                                     *y=j;
                                     }
        else if (*num_cand==0) {
             return false;
             }
        } 
    } 

    *num_cand=min;
    if (free<1) return false;
    else return true;           
}

bool Fsudoku(int tab[dim][dim]) {
 int free=0;

 int x,y;
 int cand[dim];
 int num_cand;
 brojacK=0;
 if (!Fsearch(tab,&x,&y,cand, &num_cand,free)) {
                                               if (free==0) return true;
                                               else return false;
                                               }


 for (int i=0;i<num_cand;i++) {
     tab[x][y]=cand[i];
     if (Fsudoku(tab)) return true;
     else tab[x][y]=0;
     }
 return false;

 }

谁能告诉我用Big O或Big Theta表示法对这个算法进行分类。我得到了O(n^3),但正如我们所看到的,这不是真的!所以,给我一个提示或建议如何开始,我将非常感谢。如果你喜欢,我也可以用伪代码发布这篇文章!

谢谢,MB

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-11 07:10:30

大O是关于哪个术语占主导地位。

那么每个循环运行多少次呢?

它们的长度是固定的,还是不同的?

哪些参数可以更改,从而影响运行时?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14457589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档