鱼C论坛

 找回密码
 立即注册
查看: 1370|回复: 9

[已解决]一个类似数独的迷宫问题(新开一贴)

[复制链接]
发表于 2023-4-1 14:03:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

                               
登录/注册后可看大图

感觉用回溯算法应该能实现,我有点思路,但是代码实现不了,求大神指点
之前图片太糊,于是新开一贴
最佳答案
2023-4-1 16:38:13
现在好了,nx ny 搞反了:

  1. d = [[1, 0], [-1, 0], [0, -1], [0, 1]]
  2. l_rem = [-1, 1, 1, 3, 3, 4, 5, 6] # 列剩余
  3. r_rem = [-1, 5, 3, 5, 1, 3, 2, 4] # 行剩余
  4. vis = [[0 for i in range(8)] for i in range(8)]
  5. vis[1][1] = 1
  6. l_rem[1] -= 1
  7. r_rem[1] -= 1
  8. def solve(x, y):
  9.     if x == 7 and y == 7:
  10.         ok = 1
  11.         for i in range(1, 8):
  12.             if l_rem[i] != 0 or r_rem[i] != 0:
  13.                 ok = 0
  14.                 break
  15.         if ok == 1:
  16.             for i in range(1, 8):
  17.                 for j in range(1, 8):
  18.                     print(vis[i][j], end = " ")
  19.                 print()
  20.             exit(0)
  21.     for i in d:
  22.         nx = x + i[0]
  23.         ny = y + i[1]
  24.         if nx >= 1 and nx <= 7 and ny >= 1 and ny <= 7 and vis[nx][ny] == 0:
  25.             if l_rem[ny] >= 0 and r_rem[nx] >= 0:
  26.                 l_rem[ny] -= 1
  27.                 r_rem[nx] -= 1
  28.                 vis[nx][ny] = 1
  29.                 solve(nx, ny)
  30.                 l_rem[ny] += 1
  31.                 r_rem[nx] += 1
  32.                 vis[nx][ny] = 0
  33. solve(1, 1)
复制代码

最后输出:
  1. 1 1 1 0 0 1 1
  2. 0 0 1 0 0 1 1
  3. 0 0 1 1 1 1 1
  4. 0 0 0 0 0 0 1
  5. 0 0 0 0 1 1 1
  6. 0 0 0 1 1 0 0
  7. 0 0 0 1 1 1 1
复制代码

这样一来,具体怎么走也就很简单了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 16:16:55 | 显示全部楼层
请问一共多少行,多少列,数据范围总得给出来呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-1 16:20:36 | 显示全部楼层
myd0311 发表于 2023-4-1 16:16
请问一共多少行,多少列,数据范围总得给出来呀

就是图里下面那个啊,上面那个是例子,是我图又没传全吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-1 16:21:01 | 显示全部楼层
虽然这个回溯法是可行的,但是回溯法的时间复杂度是指数级别的,行列一旦多了就会超时,我有一个 广度优先搜索 的想法,每一个状态都记录每一行的剩余值,每一列的剩余值,以及当前坐标,那么对于示例就一共有 7 ** 7 * 49 = 40353607 以下的状态,应该是能过去的,但是一旦列行超过了 10 就不好整了,可能会涉及到 dp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-1 16:24:03 | 显示全部楼层
昭昭天命amg 发表于 2023-4-1 16:20
就是图里下面那个啊,上面那个是例子,是我图又没传全吗


我懂了,这个回溯有可能会超时,为了节约时间,要不写个 广度优先搜索吧

C++ 可以么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-1 16:29:15 | 显示全部楼层
myd0311 发表于 2023-4-1 16:24
我懂了,这个回溯有可能会超时,为了节约时间,要不写个 广度优先搜索吧

C++ 可以么?

我没学过C++,只会java和python...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-1 16:37:06 | 显示全部楼层
等等,我搞反了,上面的不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-1 16:38:13 | 显示全部楼层    本楼为最佳答案   
现在好了,nx ny 搞反了:

  1. d = [[1, 0], [-1, 0], [0, -1], [0, 1]]
  2. l_rem = [-1, 1, 1, 3, 3, 4, 5, 6] # 列剩余
  3. r_rem = [-1, 5, 3, 5, 1, 3, 2, 4] # 行剩余
  4. vis = [[0 for i in range(8)] for i in range(8)]
  5. vis[1][1] = 1
  6. l_rem[1] -= 1
  7. r_rem[1] -= 1
  8. def solve(x, y):
  9.     if x == 7 and y == 7:
  10.         ok = 1
  11.         for i in range(1, 8):
  12.             if l_rem[i] != 0 or r_rem[i] != 0:
  13.                 ok = 0
  14.                 break
  15.         if ok == 1:
  16.             for i in range(1, 8):
  17.                 for j in range(1, 8):
  18.                     print(vis[i][j], end = " ")
  19.                 print()
  20.             exit(0)
  21.     for i in d:
  22.         nx = x + i[0]
  23.         ny = y + i[1]
  24.         if nx >= 1 and nx <= 7 and ny >= 1 and ny <= 7 and vis[nx][ny] == 0:
  25.             if l_rem[ny] >= 0 and r_rem[nx] >= 0:
  26.                 l_rem[ny] -= 1
  27.                 r_rem[nx] -= 1
  28.                 vis[nx][ny] = 1
  29.                 solve(nx, ny)
  30.                 l_rem[ny] += 1
  31.                 r_rem[nx] += 1
  32.                 vis[nx][ny] = 0
  33. solve(1, 1)
复制代码

最后输出:
  1. 1 1 1 0 0 1 1
  2. 0 0 1 0 0 1 1
  3. 0 0 1 1 1 1 1
  4. 0 0 0 0 0 0 1
  5. 0 0 0 0 1 1 1
  6. 0 0 0 1 1 0 0
  7. 0 0 0 1 1 1 1
复制代码

这样一来,具体怎么走也就很简单了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-4-1 16:57:30 | 显示全部楼层
myd0311 发表于 2023-4-1 16:38
现在好了,nx ny 搞反了:

最后输出:

大佬啊!感谢!不过这种写法也是回溯吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-1 17:17:34 | 显示全部楼层
昭昭天命amg 发表于 2023-4-1 16:57
大佬啊!感谢!不过这种写法也是回溯吧


对呀,这是回溯,因为不能重复走嘛

如果有用,求给一个最佳答案,感谢

bfs 也可以,只是十分麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表