#include<iostream>
using namespace std;
int a[36][2];
int m, n;
int coun = 0;
/*
将对立面的情况枚举出来
*/
//得到骰子的对立面
//在这个题里面要注意的就是这个方柱体的概念并不是说的是规则的立方体,而是tnnd赌神他老人家要垒高楼一个一个的往上放,草!
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;//要理解清楚这个arr数组存储的数据的意义,代表的是从0到n个骰子依次从下往上开始放,每个元素代表的是骰子的下面的那个面的点数
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 )%1000000007<< endl;//因为在过程中并没有考虑骰子的四个方向,所以最后要乘上2的四次方来弥补
return 0;
}
蓝桥杯 垒骰子
最新推荐文章于 2024-03-17 21:20:51 发布