补全等式 计蒜客 深度优先搜索
下图中,每个方块代表 1…13 中的某一个数字,但不重复。
例如:
1×2+9×7=13×5
10×8-12×3=11×4
只要有任意一个方块代表的数字不同,就算两种不同的方案。
请你计算,一共有多少种不同的方案。
思路:可以把它想象成经典的寻路问题,从第一个点连到第二个点,一直连到第12个点,满足上面俩式则计数。这里在清楚标记后不需要将当前位置的值清零,因为dfs退回时会给当前位置重新赋值。
答案:122368
#include<cstdio>
#include<iostream>
using namespace std;
int a[20],visited[20]={0};
int ans=0;
void dfs(int n){
if(n==6){
if(a[0]*a[1]+a[2]*a[3]!=a[4]*a[5]){
return ;//不满足计算式1,退回,循环下一个数
}
}
else if(n==12){
if(a[6]*a[7]-a[8]*a[9]==a[10]*a[11]){
ans++;
return ;//满足计算式2,退回,循环下一个数
}
}
for(int i=1;i<=13;i++){
if(!visited[i]){//如果没被访问过
a[n]=i;//给当前位置赋值
visited[i]=1;//标记当前位置已走过
dfs(n+1);//走下一个位置
visited[i]=0;//清除标记
}
}
}
int main(){
dfs(0);
cout<<ans<<endl;
return 0;
}