跟状压的思想很像
给你一个3*3的矩阵,请你给矩阵上色。其中有红绿蓝三种颜色可以选择,要求是相邻的两个点之间不能选择同一种颜色。问总共有几种上色方式?
用三进制的数组记录,然后暴力,没错就是这么粗暴
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int map[3][3];
void trans(int x,int y)
{
map[y][0] = x%3;
int a = (x - x%3)/3;
map[y][1] = a%3;
map[y][2] = a/3;
}
int judge()
{
int flag = 1;
for(int i = 0;i<3;i++)
{
for(int j = 0;j<3;j++)
{
if(i>0 && map[i][j] == map[i-1][j]) flag = 0;
if(j>0 && map[i][j] == map[i][j-1]) flag = 0;
if(i<2 && map[i][j] == map[i+1][j]) flag = 0;
if(j<2 && map[i][j] == map[i][j+1]) flag = 0;
if(flag == 0) break;
}
if(flag == 0) break;
}
return flag;
}
int main()
{
int sum = 0;
for(int i = 0;i<27;i++)
{
for(int j = 0;j<27;j++)
{
for(int k = 0;k<27;k++)
{
trans(i,0);
trans(j,1);
trans(k,2);
if(judge())
{
sum++;
}
}
}
}
cout<<sum;
return 0;
}