一个3*3的格子,给定n>=10, 将[1,n]中的数填入方格中,使得相邻方格的数的和为质数

深搜 回溯

bool isprimer(int tt)        //判断该数是否为质数
{
    if (tt == 2||tt == 3)
    {
        return true;
    }
    else if (tt == 1||tt%2 == 0)
        return false;
    for (int i = 2;i <= sqrt(static_cast<double>(tt));++i)
    {
        if (tt%i == 0)
            return false;
    }
    return true;
}
bool test(int a[],int dp,int val)          //在位置dp上加入val 是否符合相邻为质数的条件
{
    switch (dp)
    {
    case 0:
        return true;
    case 1:
    case 3:
        return isprimer(val + a[0])?1:0;
    case 2:
        return isprimer(val + a[1])?1:0;
    case 4:
        return (isprimer(val + a[1])&&isprimer(val + a[3]))?1:0;
    case 5:
        return (isprimer(val + a[2])&&isprimer(val + a[4]))?1:0;
    case 6:
        return isprimer(val + a[3])?1:0;
    case 7:
        return (isprimer(val + a[6])&&isprimer(val + a[4]))?1:0;
    case 8:
        return (isprimer(val + a[5])&&isprimer(val + a[7]))?1:0;
    }
    return true;
}

const int n = 9;

void dfs(int a[],int num[],int len,bool ch[],int dp) //深搜 回溯  num中包含符合条件的len个数  ch为判断该数是否已选(防止重复选)
{
    if (dp == n)
    {
        for (int i = 0;i < 3;++i)
        {
            for (int j = 0;j < 3;++j)
            {
                cout<<a[i*3 + j]<<' ';
            }
            cout<<endl;
        }
        system("pause");
        return;
    }
    for (int i = 0 ; i < len;++i)
    {
        if (!ch[i]&&test(a,dp,num[i]))     
        {
            ch[i] = true;
            a[dp] = num[i];
            dfs(a,num,len,ch,dp + 1);
            ch[i] = false;
        }
    }
}
int main()
{

    int a[n];
    const int len = 15;
    int num[len];
    bool ch[len];
    memset(ch,0,sizeof(ch));
    for (int i = 0;i < len;++i)
    {
        num[i] = i + 1;
    }
    dfs(a,num,len,ch,0);
    return 0;
}
posted @ 2012-09-03 20:21  Itachi7  阅读(529)  评论(0编辑  收藏  举报