题目描述
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
每个方块代表1~13中的某一个数字,但不能重复。
比如:
你一共找到了多少种方案?
看看这个寒假作业:
每个方块代表1~13中的某一个数字,但不能重复。
比如:
6 + 7 = 13以及:
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
7 + 6 = 13就算两种解法。(加法,乘法交换律后算不同的方案)
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
你一共找到了多少种方案?
答案:64
#include<iostream> #include<string> #include<string.h> #include<algorithm> #include<queue> using namespace std; double a[4][3]; int vis[15]; int ans=0; int check(int x,int y,int num) { if(x==0&&y<2) return 1; if(x==0&&y==2) { if(a[0][0]+a[0][1]==num) return 1; else return 0; } if(x==1&&y<2) return 1; if(x==1&&y==2) { if(a[1][0]-a[1][1]==num) return 1; else return 0; } if(x==2&&y<2) return 1; if(x==2&&y==2) { if(a[2][0]*a[2][1]==num) return 1; else return 0; } if(x==3&&y<2) return 1; if(x==3&&y==2) { if(a[3][0]/a[3][1]==num)//-------注意除法的时候要用double,否则会多算好多 return 1; else return 0; } return 0; } void dfs(int x,int y) { if(x==4) { ans++; // for(int i=0;i<4;i++) // { // for(int j=0;j<3;j++) // cout<<a[i][j]<<' '; // cout<<endl; // } return ; } if(y>=3) dfs(x+1,0); for(int i=1;i<=13;i++) { if(vis[i]==0&&check(x,y,i)) { a[x][y]=i; vis[i]=1; dfs(x,y+1); vis[i]=0; } } } int main() { memset(vis,0,sizeof(vis)); dfs(0,0); cout<<ans<<endl; return 0; }