题解 P1218 【[USACO1.5]特殊的质数肋骨 Superprime Rib】
看到有人用八重循环做,还写了8个if语句
其实没有那么麻烦,暴力又时也能体现出技术的美
记得小学的信奥老师讲:这种n重循环是玩不动暴力的
我:我就玩暴力怎么了
可以用递归控制循环次数,不必一一判断了
而且递归可以剪枝啊
其他思路和别人基本一样,但真的不是dfs qwq
代码:
#include <bits/stdc++.h>
using namespace std;
long long n;
inline bool isprime(long long x)//质数判断
{
if(x==1) return 0;
for(int i=2; i*i<=x; i++)
if(x%i==0) return 0;
return 1;
}
inline void Make(int k,int now)//递归控制循环次数
//看到那个inline了吗,非函数用不了这个qwq
{
if(k==0)//如果循环到了层数就退出
{
cout<<now<<endl;
return;
}
for(int i=1; i<10; i++)//循环填上数字
if(isprime(now*10+i))//如果符合条件就继续递归
Make(k-1,now*10+i);
}
int main()
{
cin>>n;
Make(n,0);
return 0;
}
qwq就是这样辣(484比dfs短好多,还没有压行呢,而且应该不是正解)
(这是压行的)
#include <bits/stdc++.h>
using namespace std;
long long n;
inline bool isprime(long long x){ if(x==1) return 0; for(int i=2; i*i<=x; i++) if(x%i==0) return 0; return 1; }
inline void Make(int k,int now){ if(k==0) { cout<<now<<endl; return; } for(int i=1; i<10; i++) if(isprime(now*10+i)) Make(k-1,now*10+i); }
int main() { cin>>n; Make(n,0); return 0; }
各位886