| 
注册时间2007-12-27最后登录1970-1-1威望 星金币 枚贡献 分经验 点鲜花 朵魅力 点上传 次下载 次积分48887在线时间 小时 
 | 
 
 发表于 2014-12-16 13:09:05
来自手机
|
显示全部楼层 
| 复制代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM_RULES 6 #define MAX_LENS_COUNT 6 #define TOTAL_STATES 56 static const int num_lens[NUM_RULES]={6,5,4,3,2,1}; static unsigned char used[TOTAL_STATES+1]; static int ruler_to_search; static int len_to_search; static int searched_len[NUM_RULES][MAX_LENS_COUNT]; static int count;  void output_result() {     int i,j;     printf("Solution %d:\n",++count);     for(i=0;i<NUM_RULES;i++){         printf("\t");         for(j=0;j<num_lens[i];j++){            printf("% 2d ",searched_len[i][j]);         }         printf("\n");     } }  void search_next() {     int i,j;     int prev_len=0;     if(len_to_search==num_lens[ruler_to_search]){         ruler_to_search++;len_to_search=0;         if(ruler_to_search==NUM_RULES){             output_result();             return;         }     }     if(len_to_search>0){        prev_len=searched_len[ruler_to_search][len_to_search-1];     }     for(i=prev_len+1;i<=TOTAL_STATES;++i){        if(used[i])continue;        for(j=0;j<len_to_search;j++){             if(used[i-searched_len[ruler_to_search][j]])break;        }        if(j<len_to_search)continue;        //find a candidate        searched_len[ruler_to_search][len_to_search]=i;        used[i]=1;        for(j=0;j<len_to_search;j++){             used[i-searched_len[ruler_to_search][j]]=1;        }        len_to_search++;        search_next();        len_to_search--;        if(len_to_search<0){             ruler_to_search--;             len_to_search=num_lens[ruler_to_search]-1;        }        used[i]=0;        for(j=0;j<len_to_search;j++){             used[i-searched_len[ruler_to_search][j]]=0;        }     } }  int main() {     search_next();     printf("Total %d solutions found\n",count); }
 | 
 |