uva 129 Krypton Factor

来源:互联网 发布:坦桑尼亚实力知乎 编辑:程序博客网 时间:2024/05/12 21:01

回溯法应用,注意dfs递归退出的条件应该放在什么位置,注意最后输出数据的格式。

#include <stdio.h>int m, n;unsigned char arr[2000];int count;int len;void dfs(int cur){int i, j, k, start;int ii, jj;bool f;if(m == count) //已经枚举到最后一个了{return;}if(1 == cur){for(i=1; i<=n; i++){arr[cur] = i;count++;if(count == m){len = cur;return;}dfs(cur+1);if(m == count)return;}return;}for(i=1; i<=n; i++){start = cur-1;f = true;while(1){for(j=start; j>=1; j--)if(i == arr[j])break;if(0 == j)break;if(j < cur-j)break;for(ii=cur-1,jj=j-1; ii>j; ii--,jj--){if(arr[ii] != arr[jj])break;}if(ii == j){f = false;break;}start = j-1;}if(f){arr[cur] = i;count++;if(count == m){len = cur;return;}dfs(cur+1);if(m == count)return;}}}void func(int m, int n){::m = m; ::n = n;count = 0;dfs(1);//打印出最后的结果int group_num, last_num, i;int start;group_num = len/4;last_num = len%4;for(i=0; i<group_num; i++){if(i != group_num-1){if(i%16 == 15){printf("%c%c%c%c\n", 'A'-1+arr[4*i+1], 'A'-1+arr[4*i+2], 'A'-1+arr[4*i+3], 'A'-1+arr[4*i+4]);}else{printf("%c%c%c%c ", 'A'-1+arr[4*i+1], 'A'-1+arr[4*i+2], 'A'-1+arr[4*i+3], 'A'-1+arr[4*i+4]);}}else{if(i%16 == 15){printf("%c%c%c%c\n", 'A'-1+arr[4*i+1], 'A'-1+arr[4*i+2], 'A'-1+arr[4*i+3], 'A'-1+arr[4*i+4]);}else{if(last_num == 0){printf("%c%c%c%c\n", 'A'-1+arr[4*i+1], 'A'-1+arr[4*i+2], 'A'-1+arr[4*i+3], 'A'-1+arr[4*i+4]);}else{printf("%c%c%c%c ", 'A'-1+arr[4*i+1], 'A'-1+arr[4*i+2], 'A'-1+arr[4*i+3], 'A'-1+arr[4*i+4]);}}}}if(last_num == 0)goto end;last_num = len%4;start = 4*group_num;for(i=1; i<=last_num; i++){printf("%c", 'A'-1+arr[start+i]);}printf("\n");end:printf("%d\n", len);}int main(void){int m, n;//freopen("input.dat", "r", stdin);while(1){scanf("%d %d", &m, &n);if(!m && !n)break;func(m, n);}return 0;}


原创粉丝点击