A:36进制
答案:1040254
B:瓷砖样式
答案:101466
题解:
- 暴力搜索+Hash去重。
- 搜索规则:先涂满整个格子,判断满足满足条件,满足条件的情况下再判断是否重复。
——涂色规则:0表示黄色,1表示橙色,分两种放瓷砖的方式,横或者竖,但都是先铺满一行,再去铺下一行,横纵都是这样。
——如何让确保所有格子都有颜色:虽然一次性涂2个格子,但是再搜索时一个格子一个格子的去判断是否涂色。 - 如何哈希去重: 利用两个素数B和MOD,一个用来当权值进行乘权,一个用来取余。
Hash值=(e[1][1] * B ^ 0+e[1][2] * B ^ 2 + … + e[3][10] * B ^ 29 ) % MOD
利用这样的计算,一般情况下,如果数组内的排列顺序稍微不一样,得到的哈希值便不同。
代码:
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#define B 29
#define MOD 10000000009
using namespace std;
typedef long long ll;
map<ll,ll> Hash;
int e[5][15];
int n=3,m=10;//代表行和列
int count1=0;//计数
bool check_color()
{
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
if((e[i][j]+e[i+1][j]+e[i][j+1]+e[i+1][j+1])%4==0)//4个值相同才能取余为0
return false;
return true;
}
void dfs(int x,int y)
{
if(e[x][y]==-1)
{
//横向涂色
if(y+1<=m&&e[x][y+1]==-1)
{
//0代表黄色,1代表橙色
for(int i=0;i<2;i++)
{
e[x][y]=e[x][y+1]=i;
//为了保证每个地方都可以被涂色,这里+1,不是+2;
//如果该行被涂满时,切换下行在最后。