C++博客 :: 首页 ::  :: 联系 ::  :: 管理

回溯法求解素数填表问题

Posted on 2006-09-13 23:13 chenger 阅读(968) 评论(0)  编辑 收藏 引用 所属分类: Programming Stuff
问题是这样的:3*3的方格,填入1-10(比10更大也可以),要求相邻两数之和为素数。 这个题目除了回溯似乎没有别的方法了。一开始还想遍历所有可能的排列,然后一个一个检查。把排列的算法写出来之后就是一个递归算法(不是效率最高的,应该说是效率最差的),但有个好处,可以在里头插入检查是否满足问题约束的代码,这样就减少了搜索的数量,也就是剪枝。希望有算法大牛来看看我这个解法对不对,心里还有些没底。

#include <cstdio>
#include
<algorithm>

using
std::printf;
 
const int N = 3;
const int Max = N*N + 1;
const int MaxSum = 2*Max - 1;

bool used[Max];
int square[N][N];
bool prime[MaxSum];

void GetAllPrimes()
{
    std::fill(prime,prime + MaxSum,
true);
    prime[
0] = prime[1] = false;
    for
(int i = 2;i < MaxSum;++i)
        if
(prime[i])
            for
(int j = i*i;j < MaxSum;j += i)
                prime[j] =
false;
}


void
Print()
{
    for(int i = 0;i < N;++i)
    {

        for
(int j = 0;j < N;++j)
            printf(
"%d\t",square[i][j]);
        printf(
"\n");
    }
}

void Search(int line,int col)
{

    if
(line == N)
    {
        Print();
        printf(
"\n");
        return;
    }

    if
(col == N)
    {
        Search(line +
1,0);
        return
;
    }

    for
(int n = 0;n < Max;++n)
    {

        if
(!used[n])
        {

            if((col > 0 && !prime[n + 1 + square[line][col - 1]])
                || (line >
0 && !prime[n + 1 + square[line - 1][col]])) 
                continue
;  
            square[line][col] = n +
1;
            used[n] =
true;
            Search(line,col +
1);
            used[n] =
false;
            square[line][col] =
0;
        }
    }
}


int
main()
{
    GetAllPrimes();
    Search(
0,0);
    return 0;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理