欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【洛谷】P1008 三连击

程序员文章站 2024-02-01 19:53:34
...

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。

输入输出格式

输入格式:

木有输入

输出格式:

若干行,每行33个数字。按照每行第11个数字升序排列。

输入输出样例

输入样例#1:

输出样例#1: 

192 384 576
* * *
...

* * *
(输出被和谐了)

本来想着怎样才能简化,最后想不出来,还专门写了两个函数,一个函数判断单个数是否有重复使用数字,另一个判断两个数字之间是否有重复使用数字。

#include <iostream>
using namespace std;

bool can(int n);
bool inspect(int n1, int n2);

int main(){
	
	//可从987 简化到333 
	for(int a=123;a<=333;a++){
		if(!can(a))continue;
		int b = a*2;
		if(!can(b))continue;
		int c = a*3;
		if(!can(c))continue;
		if(!inspect(a, b)||!inspect(a, c)||!inspect(b, c))continue;
		cout << a << " " << b << " " << c << endl;
	}
	
	return 0;
}

bool can(int n){
	int a = n%10;
	n /= 10;
	int b = n%10;
	n /= 10;
	int c = n%10;
	if(a==0||b==0||c==0||a==b||a==c||b==c)
		return false;
	else 
		return true;
}

bool inspect(int n1, int n2){
	int a1 = n1%10;
	n1 /= 10;
	int b1 = n1%10;
	n1 /= 10;
	int c1 = n1%10;
	int a2 = n2%10;
	n2 /= 10;
	int b2 = n2%10;
	n2 /= 10;
	int c2 = n2%10;
	if(a1==a2||a1==b2||a1==c2||b1==a2||b1==b2||b1==c2||c1==a2||c1==b2||c1==c2)
		return false;
	else 
		return true;
}

下面是大佬的代码,同样是暴力,都有差距,伤心了。

#include <stdio.h>
int main()
{
    int a,b,c;
    for(a=123;a<=333;a++)
            {
                b=a*2;
                c=a*3;
                if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9)))
                    printf("%d %d %d\n",a,b,c);
            }
    return 0;
} 

 

相关标签: 算法