原题链接:366:点击打开链接 32:点击打开链接 19:点击打开链接 488 :点击打开链接。。
看这几个题 都是可以用递归求解。。用递归ac完这几个题后,递归应该 掌握的差不多了。。今天把这4个题总结一下。。这四个题递归调用基本一样,之间只需 稍微改变即可。。
19 擅长排列的小明:
这个貌似只能用递归。。
代码如下:
#include<stdio.h>
#include<string.h>
int n,m;
int ok[15];//
int num[15];//存放
int ac[15];//标记
void f(int l)
{
int a,b;
if(l==m)
{
for(a=0;a<m;a++)
printf("%d",num[a]);
printf("\n");
//return;
}
else
{
for(b=0;b<n;b++)
{
if(ac[b]>0)
{
num[l]=ok[b];
ac[b]--;
f(l+1);
ac[b]++;
}
}
}
}
int main()
{
int a,b,k;
for(a=0;a<10;a++)
ok[a]=a+1;
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&n,&m);
for(a=0;a<=n;a++)
ac[a]=1;
memset(num,0,sizeof(num));
f(0);
}
}
336 D的小L:
这个也可以用next_permutation来求解。递归调用代码就不贴了。代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int a[]={1,2,3,4,5,6,7,8,9};
int k,n,i;
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
do
{
for(i=0;i<n;i++)
{
printf("%d",a[i]);
}
printf("\n");
}
while(next_permutation(a,a+n));
}
return 0;
}
32 组合数:
先看懂 擅长排列的 小明 再来看这个题 就很随意了。。
#include<stdio.h>
#include<string.h>
int n,m;
int ok[15];//
int num[15];//存放
int ac[15];//标记
void f(int l)
{
int a,b;
if(l==m)
{
for(a=0;a<m;a++)
printf("%d",num[a]);
printf("\n");
}
else
{
if(l==0)
{
for(b=n-1;b>=m-1;b--)
{
if(ac[b]>0)
{
num[l]=ok[b];
ac[b]--;
f(l+1);
ac[b]++;
}
}
}
else
{
for(b=n-1;b>=0;b--)
{
if(ac[b]>0)
{
if(l>=1&&ok[b]<num[l-1])
{
num[l]=ok[b];
ac[b]--;
f(l+1);
ac[b]++;
}
}
}
}
}
}
int main()
{
int a,b,k;
for(a=0;a<10;a++)
ok[a]=a+1;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(a=0;a<=n;a++)
ac[a]=1;
memset(num,0,sizeof(num));
f(0);
}
}
488 素数环 :
看懂上面两个递归再来看这个貌似很随意了,但这个只用递归可ac不了。会超时滴。处理时有个小规律。。当输入的n%2==1&&n!=1是一定是No Answe。这些情况就不要再递归了。。要不然你就和我一样会悲剧的。。我悲剧了两次。。
代码:
#include<stdio.h>
#include<string.h>
int ac[25]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int yi[25],sushu[50];
int ok[25]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
int loop,n;
void f(int i)
{
int a,b;
if(i==n)
{
printf("1 ");
for(a=0;a<n;a++)
printf("%d ",yi[a]);
printf("\n");
loop=1;
}
else
{
for(a=0;a<n;a++)
{
if(i==n-1)
{
if(ac[a]==1&&sushu[1+ok[a]]==0&&sushu[yi[i-1]+ok[a]]==0)
{
yi[i]=ok[a];
ac[a]--;
f(i+1);
ac[a]++;
}
}
else if(i==0)
{
if(ac[a]==1&&sushu[1+ok[a]]==0)
{
yi[i]=ok[a];
ac[a]--;
f(i+1);
ac[a]++;
}
}
else
{
if(ac[a]==1&&sushu[yi[i-1]+ok[a]]==0)
{
yi[i]=ok[a];
ac[a]--;
f(i+1);
ac[a]++;
}
}
}
}
}
int main()
{
int a,b,j=1;
memset(sushu,0,sizeof(sushu));
for(a=2;a<45;a++)
for(b=a+a;b<45;b+=a)
{
if(sushu[b]==0)
sushu[b]=1;
}
while(1)
{
scanf("%d",&n);
loop=0;
if(n==0)
break;
printf("Case %d:\n",j++);
if(n%2&&n!=1) printf("No Answer\n");
else
{
n--;
f(0);
}
}
}