背景
昨天在商场吃饭,看到一个很有趣的问题,大致描述如下:
// 问题描述:
// 如下图,如何在下图的基础上,一笔完成一个"田"字
// __
// |
//
// "田"字样式
// _____
// |__|__|
// |__|__|
想了一会,想出了一个解,解答如下:
回家的路上,就一直在想,是否还有别的答案,准备写一段程序验证一下,经过了一晚上的苦战,终于写出了答案,代码如下:
package main
import "fmt"
// 问题描述:
// 如下图,如何在下图的基础上,一笔完成一个"田"字
// _____
// |
// |
//
// "田"字样式,注意上图只是一个形状,横线和竖线最少由一个单位组成
// 0__1__2
// |__|__|
// 3 4 5
// |__|__|
// 6 7 8
// ---
// |
// 上图可能的解为
//
// __ __
// __ __
// __ __
//
//
//
//
var ret [][][2][2]int // 所有的答案
// 计算当前是否已经满足条件
func ff(edges1 [2][3]int, edges2 [3][2]int, ans [][2][2]int) {
var hengRet [][2]int
var zongRet [][2]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
if edges1[i][j] == 0 {
hengRet = append(hengRet, [2]int{i, j})
}
}
}
for i := 0; i < 3; i++ {
for j := 0; j < 2; j++ {
if edges2[i][j] == 0 {
zongRet = append(zongRet, [2]int{i, j})
}
}
}
// 小于2或者大于4都不满足条件
retCnt := len(hengRet) + len(zongRet)
if retCnt < 2 || retCnt > 4 {
return
}
// 如果是2,那么剩余的只能是4种情况
if retCnt == 2 {
if len(hengRet) == 1 && len(zongRet) == 1 {
hengX := hengRet[0][0]
hengY := hengRet[0][1]
zongX := zongRet[0][0]
zongY := zongRet[0][1]
if hengX == 0 && hengY == 0 && zongX == 1 && zongY == 0 {
ret = append(ret, ans)
return
}
if hengX == 1 && hengY == 0 && zongX == 2 && zongY == 0 {
ret = append(ret, ans)
return
}
if hengX == 0 && hengY == 1 && zongX == 1 && zongY == 1 {
ret = append(ret, ans)
return
}
if hengX == 1 && hengY == 1 && zongX == 2 && zongY == 1 {
ret = append(ret, ans)
return
}
}
return
}
// 如果是3,那么剩余的只能是4种情况
if retCnt == 3 {
if len(hengRet) == 1 {
hengX := hengRet[0][0]
hengY := hengRet[0][1]
zong1X := zongRet[0][0]
zong1Y := zongRet[0][1]
zong2X := zongRet[1][0]
zong2Y := zongRet[1][1]
if hengX == 0 && hengY == 0 {
if zong1X == 1 && zong1Y == 0 && zong2X == 1 && zong2Y == 1 ||
zong2X == 1 && zong2Y == 0 && zong1X == 1 && zong1Y == 1 {
ret = append(ret, ans)
return
}
} else if hengX == 1 && hengY == 0 {
if zong1X == 2