AcWing 1491. 圆桌座位
原题链接
简单
作者:
张航
,
2024-09-26 23:43:58
,
所有人可见
,
阅读 3
//思路:一共有n个数,故有n个位置。从第一个位置开始,依次往后找合法的数,这样就只需考虑当前这个数和前一位数是不是朋友
#include<iostream>//以及在排完时看看末位和首位是不是朋友。
using namespace std;
const int N=20;
int n,m,a,b;
bool g[N][N],st[N];
int pos[N];
int dfs(int u){
if (u==n){
if (g[pos[u-1]][pos[0]])return 0;
return 1; //return完下边的语句体便不再执行
}
int res=0;//res=0这能放这里,因为它的位置很关键,意味着只有第一遍执行dfs时res有意义,在递归其他dfs时res的累加没有意义,
for(int i=1;i<=n;i++){//而递归其他dfs的意义在于看它执行到u==n时返回的是1还是0
if(!st[i] && !g[i][pos[u-1]]){//pos的位置只有0到n-1,但填的数字有1到n,故要遍历到n;
pos[u]=i;
st[i]=true;
res+=dfs(u+1);
st[i]=false;
}
}
return res;
}
int main(){
cin>>n>>m;
while(m--){
cin>>a>>b;
g[a][b]=g[b][a]=true;
}
st[1]=true;
pos[0]=1;//初始化放的第一个位置,和这个数的状态
//全部数字及位置为1-n,从第一个位置开始深搜
cout<<dfs(1)<<endl;
return 0;
}