原题在这里:原题链接
public class Main {
public static int[][] map = new int[6][6];
public static boolean vis[][];
//check函数用来检查联通的相同颜色的个数,如果=18,则说明此分割成立
public static int check(int x,int y) {
//用sum记录相同颜色并且联通的色块
int sum = 1;
//设立一个vis数组记录当前位置是否走过,防止出现死循环
if(x+1<6&&!vis[x+1][y]&&map[x][y]==map[x+1][y]) {
vis[x+1][y]=true;//符合条件的话则说明这个位置走过了
sum+=check(x+1,y);//如果右边有,接着往右走,相同颜色的色块+1
}
if(x-1>=0&&!vis[x-1][y]&&map[x][y]==map[x-1][y]) {
vis[x-1][y]=true;//符合条件的话则说明这个位置走过了
sum+=check(x-1,y);//相同颜色的色块+1
}
if(y+1<6&&!vis[x][y+1]&&map[x][y]==map[x][y+1]) {
vis[x][y+1]=true;//符合条件的话则说明这个位置走过了
sum+=check(x,y+1);//相同颜色的色块+1
}
if(y-1>=0&&!vis[x][y-1]&&map[x][y]==map[x][y-1]) {
vis[x][y-1]=true;//符合条件的话则说明这个位置走过了
sum+=check(x,y-1);//相同颜色的色块+1
}
return sum;
}
public static void main(String[] args) {
//用一个数的二进制表示分布,0代表浅色,1代表深色
//如果形状相同,则说明图形中心对称,也就是对称点肯定是不一样的颜色;所以枚举2^18即可
int ans = 0;
for(int i=0;i<Math.pow(2,18);i++) {
int temp = i;//对i进行操作,但不能改变数值,所以用temp代替
for(int j=0;j<6;j++) {//6列
for(int k=0;k<3;k++) {//3行
map[j][k]=temp%2;
map[6-j-1][6-k-1]=1-temp%2;//对称位置赋值
temp/=2;//对下一个方格赋值
}
}
vis = new boolean[6][6];
vis[0][0]=true;
if(check(0,0)==18) {
ans++;
}
}
//之所以除以4,旋转后的图形算是一种,正方形有四种旋转方式
System.out.println(ans/4);
}
}
目录 读者基础 ?微服务架构梳理 https://www.coder4.com/homs_online/ ? ? 读者...
在大三的时候,一直就想搭建属于自己的一个博客,但由于各种原因,最终都不了了...
本文实例为大家分享了javascript实现倒计时提示框的具体代码,供大家参考,具体...
MFC项目在vs2017编译正常无报错,但是升级vs2019后一打开项目就报如下错误。 项...
本文实例为大家分享了vue实现按钮切换图片的具体代码,供大家参考,具体内容如下...
今天看到个不错的网页播放器,感觉不错,大家可以测试 我写的一个播放器网页: ...
由于固态驱动器(SSD)的速度比传统的硬盘驱动器(HDD)快得多,并且价格越来越便宜...
首先到这里下载其源码。里面东西挺多的,我们基本上可以把它放到两个文件夹就是...
目录 1. C语言文件接口(库函数) 1.1 fopen 1.2 fclose 1.3 fread 1.4 fwrite 1.5...
这5个PHP编程中的不良习惯,一定要改掉 PHP世界上最好的语言! 测试循环前数组是...