P1618 三连击(升级版)【暴力】【next_permutation】

题目

将 1, 2,..., 9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!

输入格式

三个数,A,B,CA,B,C。

输出格式

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

解析

想用next_permutation这个函数,但是实在想不起来用法,于是暴力循环了第一个代码。

法1不仅需要mark【】数组来标记这个数组是否已经永过,还需要考虑三位数的个位、十位、百位也不相同。

其中十位的数字建议使用

 l[1]=i/100;
 l[2]=i/10%10;
 l[3]=i%10;

暴力循环 i, j , q 这三个三位数。

 

法二:简洁许多。昨天的没保存就关机了。。。

代码

法1:

int A, B , C;
int mark[10];


int main() {
	cin >> A >> B >> C;
	int flag = 0;
	for(int i = 123 ; i <= 987 ; i ++) 
	{
		memset(mark , 0 , sizeof(mark)); mark[0] = 1;
		int bai = i / 100;
	//	int shi = (i - bai * 100 ) / 10;
		int shi = i / 10 % 10;
		int ge = i % 10;
		//cout << bai <<" " << shi << " " << ge << endl;
		if(mark[bai] | mark[shi] | mark[ge]) continue;
		if(bai == shi || shi == ge || bai == ge) continue;
		
		mark[bai] = mark[shi] = mark[ge] = 1;
	//	if ( i == 156 )
	//	cout << i << " " << mark[1] <<" ";
		for(int j = i + 1 ; j <= 987 ; j ++ ) 
		{
			int baij = j / 100;
			int shij = (j - baij * 100 ) / 10;
			int gej = j % 10;
			if(baij == shij || shij == gej || baij == gej) continue;
			if(mark[baij] | mark[shij] | mark[gej]) continue;
			if(i * B != j * A ) continue;
			if( j < i) continue;
			
		//	if( i == 156 ) cout << j <<" " << shij << endl; 
			mark[baij] = mark[shij] = mark[gej] = 1;
			
			for(int q = j + 1 ; q <= 987 ; q ++)
			{
				int baiq = q / 100;
				int shiq = (q - baiq * 100 ) / 10;
				int geq = q % 10;
				if(baiq == shiq || shiq == geq || baiq == geq) continue;
				if(mark[baiq] | mark[shiq] | mark[geq]) continue;
			//	mark[baiq] = mark[shiq] = mark[geq] = 1;
				if( q * B != j * C) continue;
				
				cout << i <<" " << j << " " << q << endl;
				flag  = 1;
			}
		}
	}
	if(! flag) cout << "No!!!" << endl;
}

法2:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int A , B , C;
	cin >> A >> B >> C;
	int num[10] = {0 , 1, 2, 3 , 4 , 5 , 6 , 7 ,8 , 9};
	int flag = 0;
	do
	{
		int a = num[1] * 100 + num[2] * 10 + num[3];
		int b = num[4] * 100 + num[5] * 10 + num[6];
		int c = num[7] * 100 + num[8] * 10 + num[9];
		if (a * B == b * A && a * C == c * A)
		{
			cout << a << " " << b << " " << c << endl;
			flag = 1;
		}
	//	cout << a << " " << b << " " << c << endl;
	}while(next_permutation(num + 1, num + 10));
	if ( !flag) cout << "No!!!" << endl;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章