这道题应该是很经典的,题意懒得写了,自己写的用了DFS,写了挺久的
格式是每隔4个字母有个空格,64个换行,很坑爹,错了好多次
//
// main.cpp
// u129
//
// Created by Mr.Xue on 17/2/20.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int m,n,a[100],flag,num;//1 2 1 2
int huishuo(int k)//4
{
if(k==1)
return 1;
int i,j;
for(i=k/2;i<k;i++)//2
{
for(j=1;j+i<=k;j++)//1 2
{
if(a[i+j]!=a[i*2-k+j])//3,1 4,2
break;
}
if(j>k-i)//have same
break;
}
if(i<k)
return 0;
else
return 1;
}
void DFS(int sum)
{
if(flag==1)
return;
// printf("%d \n ",num);
for(int j=1;j<=n;j++)
{
a[sum]=j;
if(huishuo(sum)==1&&flag==0)
{
// for(int i=1;i<=sum;i++)
// printf("%d",a[i]);
//printf("\n");
num++;
// printf("(%d)",num);
if(num==m)
{
//printf("(%d)\n",sum);
flag=1;
for(int i=1;i<=sum;i++)
{
if((i-1)%64==0 && (i-1))
printf("\n");
else if((i-1)%4==0 && (i-1))
printf(" ");
printf("%c",a[i]-1+'A');
}
printf("\n");
printf("%d\n",sum);
return;
}
DFS(sum+1);
}
}
//ABAC ABCA CBAB CABA CABC ACBA CABA
}
int main()
{
while(~scanf("%d %d",&m,&n))
{
if(m==0&&n==0)
break;
flag=0;
num=0;
DFS(1);
}
return 0;
}/*
7 3
30 3
0 0
*/