#include<iostream>
using namespace std;
int a[36][2];
int m, n;
int coun = 0;
/*
将对立面的情况枚举出来
*/
//得到骰子的对立面
int get(int x) {
if (x == 1) return 4;
if (x == 4) return 1;
if (x == 2) return 5;
if (x == 5) return 2;
if (x == 3) return 6;
if (x == 6) return 3;
}
bool check(int arr[],int num, int i) {
if (num == 0)return true;
int k = get(arr[num - 1]);
int s;
for ( s = 0; s < m; s++)
{
if ((a[s][0] == k&&a[s][1]==i)||(a[s][1]==k&&a[s][0]==i))
{
return false;
}
}
return true;
}
void dfs(int arr[],int num) {
if (num == n) {
coun++;
return;
}
for (int i = 1; i <= 6; i++)
{
if (check(arr, num, i)) {
arr[num] = i;
dfs(arr, num + 1);
}
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < m; i++)
{
cin >> a[i][0] >> a[i][1];
}
int *arr = new int[n];
dfs(arr,0);
cout << coun * 16 << endl;
return 0;
}
蓝桥杯 垒骰子 dfs+剪枝
最新推荐文章于 2022-03-06 20:57:44 发布