AcWing 1491. 圆桌座位
原题链接
简单
#include <iostream>
#include <cstring>
using namespace std;
const int N=11;
bool g[N][N]; //邻接矩阵存储人之间的朋友关系
int m,n; //n为人总数
int total=0; //总结果可能数
int pos[N]; //圆桌的每个位置标号上是谁
bool st[N]; //访问状态
void DFS(int x){
if(x==n+1){ //圆桌已坐满,判断第一个和最后一个人的朋友关系
if(!g[pos[n]][pos[1]]){
total++; //不是朋友,则结果可能数+1
}
return;
}
//遍历所有人,找到未访问过,且与上一个邻座的人不是朋友的人
for(int i=1;i<=n;i++){
if(!st[i]&&!g[pos[x-1]][i]){
pos[x]=i;
st[i]=true; //更新访问状态
DFS(x+1);
st[i]=false; //回溯,恢复访问状态
}
}
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
int a,b;
scanf("%d%d",&a,&b);
g[a][b]=g[b][a]=true; //a,b的朋友关系
}
pos[1]=1; //把1先放在1的位置上
st[1]=true;
DFS(2); //从2开始遍历处理
cout<<total<<endl;
return 0;
}