洛谷P1618 三连击(升级版)
我想到的就是先寻找所有的三位数,在看看有没有它的b/a(如果可以除尽的话)的每一位有没有在取过,再看它的c/a倍
#include<iostream>
#include<cstring>
using namespace std;
int n[10]; //数组n用来标记取得第一个的每一位
int vis[10]; //标记所取数的b/a和c/a倍的每一位的数字
bool isin(int x) //判断这个数的每一位是不是被用过以及标记未标记的
{
while(x>0)
{
if(n[x%10]||vis[x%10]||x%10==0) return false; //如果用过了 就不能用了
vis[x%10] = 1; //标记
x /= 10;
}
return true;
}
int main()
{
int a,b,c;
cin>>a>>b>>c;
int count=0; //记录符合的个数
for(int i=1;i<=9;i++)
{
n[i] = 1; //标记
for(int j=1;j<=9;j++)
{
if(j!=i) //不能有重复数字
n[j] = 1;
else continue; //重复就下一个
for(int k=1;k<=9;k++)
{
if(k!=i&&k!=j)
n[k] = 1;
else continue;
if(a==0) a = b; //注意这里要考虑为0时,因为后面有除以a的地方
if((i*100+j*10+k)*b%a==0&&isin((i*100+j*10+k)*b/a)) //判断所取数的b/a倍存不存在并且每一位没有被用过
{
if((i*100+j*10+k)*c%a==0&&isin((i*100+j*10+k)*c/a)) //同上判断c/a倍
{
cout<<(i*100+j*10+k)<<" "<<(i*100+j*10+k)*b/a<<" "<<(i*100+j*10+k)*c/a<<endl;
count ++;
}
}
memset(vis,0,sizeof(vis)); //清除标记
n[k] = 0; //溯洄
}
n[j] = 0;
}
n[i] = 0;
}
if(count==0) //不存在的情况
cout<<"No!!!"<<endl;
return 0;
}
终于自己写出来一道题了,虽然感觉我的解法挺麻烦的,但是还是很开心,记录一下