刘汝佳-算法竞赛入门-排列(2-6)

用1,2,3.~9组成3个三位数abc,def,ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。按照"abc def ghi"的格式输出所有解,每行一个解。

解答:1.用bool Flag[10]数组来标记数字是否出现。

           2.三个数中abc最小为 123,同时1000/3最大的组成为329,所以需要枚举123~329的所有数

          3.因为三个数九个不同的数字,所以如果abc,def,ghi存在,那么1~9都会出现,则Flag[i]中的每个元素都是true ,Flag[i]不为true,那么有数字重复,所以不成立 。

以上方法转载自https://blog.csdn.net/lecholin/article/details/69787589,其中我有所添加。

#include
int main(){
	int abc,def,ghi;
	for(int abc=123;abc<=329;++abc){
		bool Flag[10] = {false};	//统计0~9是否出现  
		//标记abc中a,b,c
		Flag[abc/100] = Flag[abc/10%10] = Flag[abc%10] = true;
		def = 2 * abc;
		//标记def中d,e,f
		Flag[def/100] = Flag[def/10%10] = Flag[def%10] = true;                                                       
		//标记ghi中g,h,i 
		ghi = 3 * abc;
		Flag[ghi/100] = Flag[ghi/10%10] = Flag[ghi%10] = true;
		
		bool flag = true;
		
		//因为三个数九个不同的数字,所以如果abc,def,ghi存在,那么1~9都会出现,则Flag[i]中的每个元素都是true 
		for(int i = 1;i<=9;++i){   
			if(Flag[i] != true){  //有Flag[i]不为true,那么有数字重复,所以不成立 
				flag = false;
				break;
			}

		}
		if(flag){
				printf("%d %d %d\n",abc,def,ghi);
			}
	}
	return 0;
}

刘汝佳-算法竞赛入门-排列(2-6)_第1张图片

你可能感兴趣的:(算法入门)