Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1525373
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2010-01-14 15:54:59


int search_suitable(int * array, int beg, int end , int * tag, int *pos,int * result,int focus)
{
    bool check;
    for(int i=beg;i    {
        if(!tag[i])        //找出没有被使用的数
        {
            result[focus] = array[i];
            //检查是否满足质数要求   
            check = true;
            if(focus >2)
                check = is_prime(result[focus]+result[focus-3]);
            if(focus!=0 && focus%3!=0)
                check &= is_prime(result[focus]+result[focus-1]);
            if(check)
            {
                pos[focus] = i;        //标记位置
                tag[i]=1;
                return 1;
            }
        }
    }
    return 0;
}

非递归算法
void fill_number_game(int *iArray,int count)
{
    sort(iArray,count);
    //用于标记是否当前数已经填入方阵的数组
    int *tag = new int[count];
    int *pos = new int[count];
    for(int i=0;i    {
        tag[i]=0;    //全部都没使用
        pos[i]=0;
    }
    int result[9]={0};
    result[0]=iArray[0];
    tag[0]=1;
    i=0;
    int seq_num = 0;
    bool ended = false;
    bool set = false;
    while(!ended)
    {
        if(result[0]==iArray[count-1])
            set = true;
        if(i==8)
        {
            printf("第%3d种方案:\n",++seq_num);
            for(int j=0;j<9;j++)
            {
                printf("%4d",result[j]);
                if((j+1)%3==0 && (j!=0) )
                    printf("\n");
            }
            //回溯
            while(!check)
            {
                pos[i]=0;
                i--;
                tag[pos[i]] = 0;
                check = search_suitable(iArray,pos[i]+1,count,tag,pos,result,i);
            }
        }
        i++;                //向前搜索
        check = search_suitable(iArray,0,count,tag,pos,result,i); //找出合适的数读入
        while(!check)            //检查失败,回溯
        {
            pos[i]=0;        //去掉位置信息
            i--;
            if(i<0)
            {
                if(set)
                    ended = true;
                break;
            }
            tag[pos[i]]=0;            //重新标记为没有使用
            check = search_suitable(iArray,pos[i]+1,count,tag,pos,result,i);
        }
    }
}

递归算法:
bool used[Max];
int  pos[MAX];
static seq_num=0;
int *result;
void fill_number_game(int *iArray,int count, int i)
{
     if(i== count-1)
     {
            printf("第%3d种方案:\n",++seq_num);
            for(int j=0;j<9;j++)
            {
                printf("%4d",result[j]);
                if((j+1)%3==0 && (j!=0))  //每3个一行
                    printf("\n");
            }
       
    return;
     }

     if
(i<0)
         return
;
     for
(int n = 0;n < count;++n)
     {

         if
(!used[n])
         {

            if(search_suitable(iArray,n,count,used,pos,result,i)==false  )  
                 continue
;  
           
pos[i] = n;
            used[n] =
true;
           
fill_number_game(iArray,count, i+1);
            used[n] =
false;
           
pos[i] = 0;
         }
     }

  
}
int main()
{
   
sort(iArray,count);
    result = new int[count];
    for(int i=0;i    {
        used[i]=0;    //全部都没使用
        pos[i]=0;
    }
    fill_number_game(iArray,count,result,0);
    return 0;
}

阅读(898) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~