在下图的基础上,一笔写出“田”字

商场中遇到的独特问题,挑战用一笔完成‘田’字绘制。通过思考得出初步解答,并编程验证,发现共有44种不同的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

昨天在商场吃饭,看到一个很有趣的问题,大致描述如下:

// 问题描述:
// 如下图,如何在下图的基础上,一笔完成一个"田"字
//  __
//    |
//
//   "田"字样式
//   _____
//  |__|__|
//  |__|__|

想了一会,想出了一个解,解答如下:

在这里插入图片描述
回家的路上,就一直在想,是否还有别的答案,准备写一段程序验证一下,经过了一晚上的苦战,终于写出了答案,代码如下:

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值