题目大意:
蓝桥学院由 21 栋教学楼组成,教学楼编号 1 到 21。对于两栋教学楼 a 和 b,当 a 和 b 互质时,a 和 b 之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。
小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?
两个访问方案不同是指存在某个 i,小蓝在两个访问方法中访问完教学楼 i 后访问了不同的教学楼。
解题思路:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 21;
const long long distination = (1<<maxn)-1;
long long int dp[1 << maxn][maxn];
bool canvisit(int a,int b){ //用最大公约数判定互质
if(__gcd(a,b)>1){
return false;
}
return true;
}
long long dfs(int num,long long state){ //记忆化搜索
if(dp[state][num-1]>=0){
return dp[state][num-1];
}
long long res=0;
for(int i=1;i<=maxn;i++){
if(i!=num&&canvisit(num,i)&&(((state>>i-1)&1)==0)){
res+=dfs(i,state+(1<<i-1));
}
}
return dp[state][num-1]=res;
}
int main(){
memset(dp,-1,sizeof(dp));
dp[distination][0]=1;
cout<<dfs(1,0);
}