你一定还记得小学学习过的乘法计算过程,比如:
273
x 15
------
1365
273
------
4095
请你观察如下的乘法算式
***
x ***
--------
***
***
***
--------
*****
星号代表某位数字,注意这些星号中,
0~9中的每个数字都恰好用了2次。
(如因字体而产生对齐问题,请参看图p1.jpg)
请写出这个式子最终计算的结果,就是那个5位数是多少?
注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。
思路:DFS
#include<stdio.h> #include<iostream> using namespace std; int a[20]; int f[10];//计算0-9出现了多少次 int f2[10]; void show(){ for(int i=0;i<20;i++){ if(i==3||i==6||i==9||i==12||i==15) printf(" %d",a[i]); else printf("%d",a[i]); } printf(" ------------- "); } bool ok(){ for(int i=0;i<10;i++){ if(f[i]>2) return false; } return true; } void dfs(int x){ if(x==6){ for(int i=0;i<10;i++){ f[i]=f2[i]; // printf("%d,",f[i]); } int t=a[0]*100+a[1]*10+a[2]; for(int i=6;i<13;i=i+3){ if(i<9){ if(a[5]*t/1000!=0) return; a[i]=a[5]*t/100; a[i+1]=a[5]*t/10%10; a[i+2]=a[5]*t%10; } if(i==9){ if(a[4]*t/1000!=0) return; a[i]=a[4]*t/100; a[i+1]=a[4]*t/10%10; a[i+2]=a[4]*t%10; } if(i==12){ if(a[3]*t/1000!=0) return; a[i]=a[3]*t/100; a[i+1]=a[3]*t/10%10; a[i+2]=a[3]*t%10; } f[a[i]]++; f[a[i+1]]++; f[a[i+2]]++; if(!ok()) return; } int t1=a[3]*t*100+a[4]*t*10+a[5]*t; if (t1/100000!=0) return; a[15]=t1/10000; a[16]=t1/1000%10; a[17]=t1/100%10; a[18]=t1/10%10; a[19]=t1%10; for(int i=15;i<20;i++){ f[a[i]]++; if(!ok()){ return; } } show(); return; } for(int i=0;i<10;i++){ if(f2[i]<2){ a[x]=i; f2[i]++; dfs(x+1); f2[i]--; } } } int main(){ dfs(0); return 0; }