回溯法应用,注意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;
}