例9 巧妙填数
1 | 9 | 2 |
3 | 8 | 4 |
5 | 7 | 6 |
将1~9这九个数字填入九个空格中。每一横行的三个数字组成一个三位数。如果要使第二行的三位数是第一行的两倍, 第三行的三位数是第一行的三倍, 应怎样填数。
分析:本题目有9个格子,要求填数,如果不考虑问题给出的条件,共有9!=362880种方案,在这些方案中符合问题条件的即为解。因此可以采用枚举法
#include<string.h>
#include<stdio.h>
#define PRODUCT 1*2*3*4*5*6*7*8*9
#define SUM 1+2+3+4+5+6+7+8+9
bool check_same(int num)
{
int bai = num / 100;
int shi = ( num / 10) % 10;
int ge = ( num % 100) % 10;
if(bai == shi || bai == ge || shi == ge || shi == 0 || ge == 0)
return true;
else return false;
}
int product_num(int num)
{
int bai = num / 100;
int shi = ( num / 10) % 10;
int ge = ( num % 100) % 10;
return bai * shi * ge;
}
int sum_num(int num)
{
int bai = num / 100;
int shi = ( num / 10) % 10;
int ge = ( num % 100) % 10;
return bai + shi + ge;
}
bool check_size(int num)
{
int sum = sum_num(num) + sum_num(num*2) + sum_num(num*3);
int product = product_num(num) * product_num(num*2) * product_num(num*3);
if(sum == SUM && product == PRODUCT)
return true;
else return false;
}
void main()
{
for(int i = 123;i <= 398;i++)
{
if(check_same(i))
{
continue;
}else if(check_size(i))
{
printf("%d/t%d/t%d/n",i,i*2,i*3);
}
}
}