// 开心消消乐
var m = 0 // 行
var n = 0 // 列
var strings: [[String]] = []
func HW2023017() {
// 测试用例
// let nums = "3 3"
// strings = [["1","0","1"], ["0","1","0"], ["1","0","1"]]
// let nums = "4 4"
// strings = [["1","1","0","0"], ["0","0","0","1"], ["0","0","1","1"], ["1","1","1","1"]]
// 开始代码
let nums = String(readLine()!)
let numsArr = nums.components(separatedBy: " ").map { Int($0) ?? 0}
while let line = readLine() {
let num = line.components(separatedBy: " ")
if num.count > 0 {
strings.append(num)
}
}
n = Int(numsArr.first!)
m = Int(numsArr.last!)
var res = 0
for i in 0..<n {
for j in 0..<m {
if strings[i][j] == "1" {
strings[i][j] = "0"
// 回溯法处理数据更换问题
handleOnePadding(i, j)
res += 1
}
}
}
print(res)
}
func handleOnePadding(_ x: Int, _ y: Int) {
if x > 0 {
if strings[x-1][y] == "1" { // 上
strings[x-1][y] = "0"
handleOnePadding(x-1, y)
}
if y > 0 && strings[x-1][y-1] == "1" { // 左上
strings[x-1][y-1] = "0"
handleOnePadding(x-1, y-1)
}
if y < m-1 && strings[x-1][y+1] == "1" { // 右上
strings[x-1][y+1] = "0"
handleOnePadding(x-1, y+1)
}
}
if x < n-1 {
if strings[x+1][y] == "1" { // 下
strings[x+1][y] = "0"
handleOnePadding(x+1, y)
}
if y > 0 && strings[x+1][y-1] == "1" { // 左下
strings[x+1][y-1] = "0"
handleOnePadding(x+1, y-1)
}
if y < m-1 && strings[x+1][y+1] == "1" { // 右下
strings[x+1][y+1] = "0"
handleOnePadding(x+1, y+1)
}
}
if y > 0 && strings[x][y-1] == "1" { // 左
strings[x][y-1] = "0"
handleOnePadding(x, y-1)
}
if y < m-1 && strings[x][y+1] == "1" { // 右
strings[x][y+1] = "0"
handleOnePadding(x, y+1)
}
}
华为OD机试真题2023_Swift_100_开心消消乐
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 解题思路1、先对所有木材进行升序排列2、对木料m一节一节的减少,直到减少到 03、对升序的木板进行遍历,如果前一个...
- 解题思路双层 for 循环将数组当前下标的左侧和右侧乘积算出来,再进行比较,如果相等就将当前下标保存到数组中,最后...
- 解题思路使用双层循环,外层谜面,内层谜底1、变序:判断交换顺序后是否相同2、去重:判断两个字符串去掉重复字符后是否...
- 解题思路1、对报纸字符串和匿名字符串使用空格分隔2、对分隔后得到两个数组分别对其自己的每个元素进行排序3、对匿名数...