题解 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

posted @ 2020-03-23 12:59  Laser_Crystal  阅读(259)  评论(0编辑  收藏  举报