前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色

2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色

原创
作者头像
福大大架构师每日一题
修改于 2021-08-30 03:07:46
修改于 2021-08-30 03:07:46
3390
举报

2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色的格子数必须相同的,上下左右的格子算相邻,相邻格子染的颜色必须不同,所有格子必须染色,返回至少多少种颜色可以完成任务。

福大大 答案2021-08-29:

1.暴力法,看规律。

2.数学法。规律是N*M最小的质数因子就是需要的返回值。

代码用golang编写。代码如下:

代码语言:txt
AI代码解释
复制
package main

import "fmt"

func main() {
    ret := minColors(4, 2)
    fmt.Println(ret)
}

// N * M的棋盘
// 每种颜色的格子数必须相同的
// 相邻格子染的颜色必须不同
// 所有格子必须染色
// 返回至少多少种颜色可以完成任务

func minColors(N int, M int) int {
    // 颜色数量是i
    for i := 2; i < N*M; i++ {
        matrix := make([][]int, N)
        for i := 0; i < N; i++ {
            matrix[i] = make([]int, M)
        }
        // 下面这一句可知,需要的最少颜色数i,一定是N*M的某个因子
        if (N*M)%i == 0 && can(matrix, N, M, i) {
            return i
        }
    }
    return N * M
}

// 在matrix上染色,返回只用pNum种颜色是否可以做到要求
func can(matrix [][]int, N int, M int, pNum int) bool {
    all := N * M
    every := all / pNum
    rest := make([]int, 0)
    rest = append(rest, 0)
    for i := 1; i <= pNum; i++ {
        rest = append(rest, every)
    }
    return process(matrix, N, M, pNum, 0, 0, rest)
}

func process(matrix [][]int, N int, M int, pNum int, row int, col int, rest []int) bool {
    if row == N {
        return true
    }
    if col == M {
        return process(matrix, N, M, pNum, row+1, 0, rest)
    }
    left := 0
    if col != 0 {
        left = matrix[row][col-1]
    }
    up := 0
    if row != 0 {
        up = matrix[row-1][col]
    }
    for color := 1; color <= pNum; color++ {
        if color != left && color != up && rest[color] > 0 {
            count := rest[color]
            rest[color] = count - 1
            matrix[row][col] = color
            if process(matrix, N, M, pNum, row, col+1, rest) {
                return true
            }
            rest[color] = count
            matrix[row][col] = 0
        }
    }
    return false
}

func twoSelectOne(c bool, a int, b int) int {
    if c {
        return a
    } else {
        return b
    }
}

执行结果如下:

图片
图片

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-08-20:打砖块。有一个 m x n 的二元网格,其中 1 表
2021-08-20:打砖块。有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白。砖块 稳定(不会掉落)的前提是:1.一块砖直接连接到网格的顶部,或者,2.至少有一块相邻(4 个方向之一)砖块 稳定 不会掉落时。给你一个数组 hits ,这是需要依次消除砖块的位置。每当消除 hitsi = (rowi, coli) 位置上的砖块时,对应位置的砖块(若存在)会消失,然后其他的砖块可能因为这一消除操作而掉落。一旦砖块掉落,它会立即从网格中消失(即,它不会落在其他稳定的砖块上)。返回一个数组 result ,其中 resulti 表示第 i 次消除操作对应掉落的砖块数目。注意,消除可能指向是没有砖块的空白位置,如果发生这种情况,则没有砖块掉落。
福大大架构师每日一题
2021/08/20
3060
2021-08-20:打砖块。有一个 m x n 的二元网格,其中 1 表
2021-12-28:给定一个二维数组matrix,matrix[i][j] = k代
从(i,j)位置可以随意往右跳<=k步,或者从(i,j)位置可以随意往下跳<=k步,
福大大架构师每日一题
2021/12/28
2650
河北工业大学ACM选拔赛10月末
给树染色.相邻结点的颜色不同.求最后的颜色.后面的颜色会覆盖前面的.没有染色成功的输出0
xiaohejun
2020/02/18
6190
2021-09-05:单词搜索 II。给定一个 m x n 二维字符网格 bo
2021-09-05:单词搜索 II。给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。力扣212。
福大大架构师每日一题
2021/09/05
2630
2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: ‘A‘ (表示苹果)
2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k,
福大大架构师每日一题
2023/07/25
2200
2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: ‘A‘ (表示苹果)
2023-08-16:用go语言如何解决进击的骑士算法问题呢?
2023-08-16:用go写算法。一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,
福大大架构师每日一题
2023/08/29
1360
2023-08-16:用go语言如何解决进击的骑士算法问题呢?
2021-09-04:加油站。在一条环路上有 N 个加油站,其中第
2021-09-04:加油站。在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gasi 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 costi 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明: 如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。力扣134。
福大大架构师每日一题
2021/09/04
3960
【题解】[NOIP2017普及组]棋盘
有一个m×mm \times mm×m的棋盘,棋盘上每一个格子可能是红色、黄色或没有任何颜色的。你现在要从棋盘的最左上角走到棋盘的最右下角。
fishhh
2022/10/04
1.7K0
【题解】[NOIP2017普及组]棋盘
2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, wo
2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。
福大大架构师每日一题
2021/09/03
1.1K0
2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, wo
【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)
在补图的一个奇圈里(由奇数个点组成的环)每个点都是可以参加的。而一个奇圈一定在点双连通分量里,所以我们把原图的每个点双连通分量找出来,然后判断是否有奇圈。用到了几个引理:
饶文津
2020/06/02
5450
马踏棋盘 - plus studio
这段代码使用一个while循环来控制马的移动,直到访问了棋盘上的所有格子(move_count达到SIZE * SIZE)或者无法找到合适的下一步移动位置。
plus sign
2024/02/29
950
2021-11-09:设计井字棋。谁先同行或者同列都是自己的棋子,就算获得胜利 。力扣348。
2021-11-09:设计井字棋。谁先同行或者同列都是自己的棋子,就算获得胜利 。力扣348。
福大大架构师每日一题
2021/11/09
2700
2023-09-27:用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始, 并
用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,
福大大架构师每日一题
2023/09/28
1790
2023-09-27:用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始, 并
2022-04-08:在一张 无向 图上,节点编号0~N-1。老鼠开始在1节点,猫在2节点,0号节点是洞,老鼠想进洞, 老鼠第先出发,猫后出发,轮流行动。 在每
2022-04-08:在一张 无向 图上,节点编号0~N-1。老鼠开始在1节点,猫在2节点,0号节点是洞,老鼠想进洞,
福大大架构师每日一题
2022/04/08
1500
​2021-06-12:已知一棵搜索二叉树上没有重复值的节点,现在有一个数组
2021-06-12:已知一棵搜索二叉树上没有重复值的节点,现在有一个数组arr,是这棵搜索二叉树先序遍历的结果。请根据arr生成整棵树并返回头节点。
福大大架构师每日一题
2021/06/12
3190
​2021-06-12:已知一棵搜索二叉树上没有重复值的节点,现在有一个数组
2021-04-27:如果一个字符相邻的位置没有相同字符
2021-04-27:如果一个字符相邻的位置没有相同字符,那么这个位置的字符出现不能被消掉。比如:"ab",其中a和b都不能被消掉 。如果一个字符相邻的位置有相同字符,就可以一起消掉。比如:“abbbc”,中间一串的b是可以被消掉的, 消除之后剩下“ac”。某些字符如果消掉了,剩下的字符认为重新靠在一起。给定一个字符串,你可以决定每一步消除的顺序,目标是请尽可能多的消掉字符,返回最少的剩余字符数量。比如:"aacca", 如果先消掉最左侧的"aa",那么将剩下"cca",然后把"cc"消掉,剩下的"a"将无法再消除,返回1。但是如果先消掉中间的"cc",那么将剩下"aaa",最后都消掉就一个字符也不剩了,返回0,这才是最优解。 再比如:"baaccabb",如果先消除最左侧的两个a,剩下"bccabb",如果再消除最左侧的两个c,剩下"babb", 最后消除最右侧的两个b,剩下"ba"无法再消除,返回2。而最优策略是:先消除中间的两个c,剩下"baaabb",再消除中间的三个a,剩下"bbb",最后消除三个b, 不留下任何字符,返回0,这才是最优解。
福大大架构师每日一题
2021/05/04
4710
2021-04-27:如果一个字符相邻的位置没有相同字符
2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a
2021-09-08:每一个项目都有三个数,a,b,c表示这个项目a和b乐队参演,花费为c。每一个乐队可能在多个项目里都出现了,但是只能被挑一次。nums是可以挑选的项目数量,所以一定会有nums2只乐队被挑选出来。返回一共挑nums轮(也就意味着一定请到所有的乐队),最少花费是多少。如果怎么都无法在nums轮请到nums2只乐队且每只乐队只能被挑一次,返回-1。nums<9,programs长度小于500,每组测试乐队的全部数量一定是nums2,且标号一定是0 ~ nums2-1。
福大大架构师每日一题
2021/09/08
2510
回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
用户1145562
2020/10/23
6640
2023-07-09:给定N、M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种
2.调用 process 函数,传入初始参数:路径数组 path,颜色是否使用的数组 set,当前处理的位置 i,格子数量 n,颜色种类 m。
福大大架构师每日一题
2023/07/25
1830
2023-07-09:给定N、M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种
【算法竞赛 - 搜索】Black And White
n*m的棋盘,用k种颜色(每种颜色可以染Ci次)染完,且没有十字相邻格子的颜色一致。
Livinfly
2022/10/26
3040
推荐阅读
2021-08-20:打砖块。有一个 m x n 的二元网格,其中 1 表
3060
2021-12-28:给定一个二维数组matrix,matrix[i][j] = k代
2650
河北工业大学ACM选拔赛10月末
6190
2021-09-05:单词搜索 II。给定一个 m x n 二维字符网格 bo
2630
2023-06-30:给你一个 rows * cols 大小的矩形披萨和一个整数 k, 矩形包含两种字符: ‘A‘ (表示苹果)
2200
2023-08-16:用go语言如何解决进击的骑士算法问题呢?
1360
2021-09-04:加油站。在一条环路上有 N 个加油站,其中第
3960
【题解】[NOIP2017普及组]棋盘
1.7K0
2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, wo
1.1K0
【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)
5450
马踏棋盘 - plus studio
950
2021-11-09:设计井字棋。谁先同行或者同列都是自己的棋子,就算获得胜利 。力扣348。
2700
2023-09-27:用go语言,在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始, 并
1790
2022-04-08:在一张 无向 图上,节点编号0~N-1。老鼠开始在1节点,猫在2节点,0号节点是洞,老鼠想进洞, 老鼠第先出发,猫后出发,轮流行动。 在每
1500
​2021-06-12:已知一棵搜索二叉树上没有重复值的节点,现在有一个数组
3190
2021-04-27:如果一个字符相邻的位置没有相同字符
4710
2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a
2510
回溯算法
6640
2023-07-09:给定N、M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当涂满N个格子,并且M种
1830
【算法竞赛 - 搜索】Black And White
3040
相关推荐
2021-08-20:打砖块。有一个 m x n 的二元网格,其中 1 表
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文