输入任意正整数n(n>=3),要求输出由1,1,2,2,3,3...,n,n等2n个数组成的数列,使得:
两个“n”之间有n个数
如输入3,则输出231213或312132
#include<iostream>
using namespace std;
struct remark
{
int frist;//记录第一个下标位置
int second;//记录第二个下标位置
};
void func(struct remark s[], int size, int k)//tab[i]用于记录i+1的两个下标位置; depth:[0, size)
{
int i, j;
if (k == size)//打印结果
{
int* res = new int[size * 2];
for (i = 0; i < size; ++i)
{
res[s[i].frist] = res[s[i].second] = i + 1;
}
for (i = 0; i < 2 * size; ++i)
{
printf("%d", res[i]);
}
printf("\n");
delete[]res;
}
else
{
for (i = 0; i < 2 * size; ++i)
{
//剪枝
if (i + k + 2 >= 2 * size)//第二个位置不合法
{
break;
}
for (j = 0; j < k; ++j)//查找depth+1的位置是不是已经被占用
{
if ((s[j].frist == i || s[j].second == i) || (s[j].frist == i + k + 2 || s[j].second == i + k + 2))
{
break;
}
}
if (j < k)//位置已经被占用
{
continue;
}
s[k].frist = i;//第一个depth + 1的位置为i
s[k].second = i + k + 2;//第二个depth + 1的位置为i + depth + 2
func(s, size, k + 1);
}
}
}
int main()
{
int size;
cin >> size;
struct remark* ss = new struct remark[size];
func(ss, size, 0);
delete[]ss;
system("pause");
return 0;
}
递归算法转为迭代算法
主要就是while 循环判断
k用For