- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 43421
- 在线时间
- 小时
|
发表于 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); }
复制代码 |
|