鱼C论坛

 找回密码
 立即注册
查看: 1289|回复: 10

[已解决]求大神帮忙解决!

[复制链接]
发表于 2018-3-14 23:18:08 | 显示全部楼层 |阅读模式

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

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

x
求大神帮忙解决!
最佳答案
2018-3-15 15:11:10
我这跟据自己的思路写了个。参考下:

2018-03-15_150903.png

  1. '''
  2. 提起数独我想我们很多人都了解,也很喜欢玩。数独基于一个9X9的拉丁方。要求将数字1 至9 填入方格中,使之在每行每列都只出现一次。不过,它还有一条附加的要求。9X9的方格被切割成9个3X3的小方块。每个小方块中也都要包含数字1 到9。

  3. 5 8 1 4 9 3 7 6 2
  4. 9 6 3 7 1 2 5 8 4
  5. 2 7 4 8 6 5 9 3 1
  6. 1 2 9 5 4 6 3 7 8
  7. 4 3 6 1 8 7 2 9 5
  8. 7 5 8 3 2 9 1 4 6
  9. 8 9 2 6 7 1 4 5 3
  10. 6 1 5 9 3 4 8 2 7
  11. 3 4 7 2 5 8 6 1 9

  12. 1 2 3 4 5 6 7 8 9
  13. 2 3 4 5 6 7 8 9 1
  14. 3 4 5 6 7 8 9 1 2
  15. 4 5 6 7 8 9 1 2 3
  16. 5 6 7 8 9 1 2 3 4
  17. 6 7 8 9 1 2 3 4 5
  18. 7 8 9 1 2 3 4 5 6
  19. 8 9 1 2 3 4 5 6 7
  20. 9 1 2 3 4 5 6 7 8
  21. '''


  22. # 输入的字符串转换成列表
  23. def convertToList(row):
  24.     clist=[]
  25.     for each in row:
  26.         if each != ' ':
  27.             clist.append(int(each))
  28.     return clist

  29. def judge_sd(sd_list):
  30.     flag = 1
  31.     # 判断是否为拉丁方阵
  32.     for col in range(9):
  33.         temp = []
  34.         for row in sd_list:
  35.             if len(set(row)) != 9:
  36.                 flag = 0
  37.                 break
  38.             temp.append(row[col])

  39.         if flag == 0:
  40.             break
  41.             
  42.         if len(set(temp)) != 9:
  43.             flag = 0
  44.             break

  45.     # 如果是拉丁方阵,则判断是否为数独
  46.     if flag:   
  47.         for i in range(3):
  48.             for j in range(3):
  49.                 temp = []
  50.                 for r in range(3):
  51.                     for c in range(3):
  52.                         temp.append(sd_list[i*3+r][j*3+c])
  53.                 if len(set(temp)) != 9:
  54.                     flag = 0
  55.                     return flag # 返回并退出循环嵌套
  56.    
  57.         
  58.     return flag
  59.    
  60.             
  61. def judge_print(sd_list):
  62.     sd_num = len(sd_list)
  63.     for i in range(sd_num):
  64.         if judge_sd(sd_list[i]):
  65.             print("Right")
  66.         else:
  67.             print("Wrong")
  68.         
  69.             

  70. sd_list=[]
  71. sd_num=int(input("请输入数独数目:"))

  72. while(sd_num):
  73.     row = input()
  74.     temp = []
  75.     while(row !=''):
  76.         row = convertToList(row)
  77.         temp.append(row)
  78.         row = input()
  79.     sd_list.append(temp)

  80.     sd_num-=1

  81. judge_print(sd_list)


复制代码
捕获1.PNG
捕获2.PNG
捕获3.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-14 23:22:08 | 显示全部楼层

回帖奖励 +3 鱼币

这不就是八皇后问题么,用递归
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-14 23:27:50 | 显示全部楼层
ba21 发表于 2018-3-14 23:22
这不就是八皇后问题么,用递归

可是这道题不知道怎么用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-14 23:38:11 | 显示全部楼层
kykio 发表于 2018-3-14 23:27
可是这道题不知道怎么用

不对不对,看错了。
这是拉丁方阵,也叫数独吧。
具体思路是:
第1行输出 123456789
那么2行就是:234567891
3行就是:345678912
..........
这样就行列就不会有想同的了

照上面的把行,或列顺序打乱,一个意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-15 00:16:40 | 显示全部楼层
ba21 发表于 2018-3-14 23:38
不对不对,看错了。
这是拉丁方阵,也叫数独吧。
具体思路是:

不对吧!
上面第二个测试用例就是你说的那样,结果不对
而且每3*3的格子里不能有一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 00:50:57 | 显示全部楼层
kykio 发表于 2018-3-15 00:16
不对吧!
上面第二个测试用例就是你说的那样,结果不对
而且每3*3的格子里不能有一样的

不好意思,刚刚看了下说明,数独和拉丁方阵还是有区别:
提起数独我想我们很多人都了解,也很喜欢玩。数独基于一个9X9的拉丁方。要求将数字1 至9 填入方格中,使之在每行每列都只出现一次。不过,它还有一条附加的要求。9X9的方格被切割成9个3X3的小方块。每个小方块中也都要包含数字1 到9。

等明天再看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 08:31:15 | 显示全部楼层

回帖奖励 +3 鱼币

学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 10:26:44 | 显示全部楼层

回帖奖励 +3 鱼币

先写了一个,没有仔细查看有无错误。
为了方便,把数据直接做出字符串了。
  1. str1 = '''5 8 1 4 9 3 7 6 2
  2. 9 6 3 7 1 2 5 8 4
  3. 2 7 4 8 6 5 9 3 1
  4. 1 2 9 5 4 6 3 7 8
  5. 4 3 6 1 8 7 2 9 5
  6. 7 5 8 3 2 9 1 4 6
  7. 8 9 2 6 7 1 4 5 3
  8. 6 1 5 9 3 4 8 2 7
  9. 3 4 7 2 5 8 6 1 9
  10. 1 2 3 4 5 6 7 8 9
  11. 2 3 4 5 6 7 8 9 1
  12. 3 4 5 6 7 8 9 1 2
  13. 4 5 6 7 8 9 1 2 3
  14. 5 6 7 8 9 1 2 3 4
  15. 6 7 8 9 1 2 3 4 5
  16. 7 8 9 1 2 3 4 5 6
  17. 8 9 1 2 3 4 5 6 7
  18. 9 1 2 3 4 5 6 7 8'''
  19. list1 = str1.split('\n')
  20. for n in range(2):
  21.     list2 = [list1[i].split() for i in range(n * 9, n * 9 + 9)]
  22.     flag = 0
  23.     while True:
  24.         for i in range(9):
  25.             if len({j for j in list2[i]}) != 9:
  26.                 flag = 1
  27.                 break
  28.         if flag: break
  29.         for i in range(9):
  30.             if len(set({list2[j][i] for j in range(9)})) != 9:
  31.                 flag = 1
  32.                 break
  33.         if flag: break
  34.         for i in range(3):
  35.             for j in range(3):
  36.                 if len(set(list2[i * 3][j * 3 + k] for k in range(3))|\
  37.                        set(list2[i * 3 + 1][j * 3 + k] for k in range(3))|\
  38.                        set(list2[i * 3 + 2][j * 3 + k] for k in range(3)))\
  39.                        != 9:
  40.                     flag = 1
  41.                     break
  42.             if flag: break
  43.         break
  44.     print('Wrong' if flag else 'Right')
  45.         

复制代码

评分

参与人数 1荣誉 +3 鱼币 +4 贡献 +2 收起 理由
kykio + 3 + 4 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 10:53:14 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-3-15 11:03 编辑
  1. #  方法很笨,但可以实现判断是否是正确的数独的功能。
  2. #  想不出什么好办法,期待高人出没。

  3. def isRightSudoku(n):
  4.     # 判断各行
  5.     for i in range(9):
  6.         if len(n[i]) == 9 and set(n[i]) == set(range(1,10)):
  7.             continue
  8.         else:
  9.             return False

  10.     # 判断各列
  11.     s = [[n[j][i] for j in range(9)] for i in range(9)]
  12.     for i in range(9):
  13.         if len(s[i]) == 9 and set(s[i]) == set(range(1,10)):
  14.             continue
  15.         else:
  16.             return False

  17.     # 判断各九宫格
  18.     jiugong = [[] for i in range(9)]
  19.     for i in range(9):
  20.         for j in range(3):
  21.             jiugong[i].extend(n[(i//3)*3+j][(i%3)*3:(i%3)*3+3])
  22.     for i in range(9):
  23.         if len(jiugong[i]) == 9 and set(jiugong[i]) == set(range(1,10)):
  24.             continue
  25.         else:
  26.             return False
  27.     return True


  28. sudokuA = '''5 8 1 4 9 3 7 6 2
  29. 9 6 3 7 1 2 5 8 4
  30. 2 7 4 8 6 5 9 3 1
  31. 1 2 9 5 4 6 3 7 8
  32. 4 3 6 1 8 7 2 9 5
  33. 7 5 8 3 2 9 1 4 6
  34. 8 9 2 6 7 1 4 5 3
  35. 6 1 5 9 3 4 8 2 7
  36. 3 4 7 2 5 8 6 1 9'''

  37. sudokuB = '''1 2 3 4 5 6 7 8 9
  38. 2 3 4 5 6 7 8 9 1
  39. 3 4 5 6 7 8 9 1 2
  40. 4 5 6 7 8 9 1 2 3
  41. 5 6 7 8 9 1 2 3 4
  42. 6 7 8 9 1 2 3 4 5
  43. 7 8 9 1 2 3 4 5 6
  44. 8 9 1 2 3 4 5 6 7
  45. 9 1 2 3 4 5 6 7 8'''

  46. #  把数独A和数独B由字符串转换为二位数组
  47. sudokuA = [i.split(' ') for i in sudokuA.split('\n')]
  48. sudokuA = [[int(i) for i in j] for j in sudokuA]
  49. sudokuB = [i.split(' ') for i in sudokuB.split('\n')]
  50. sudokuB = [[int(i) for i in j] for j in sudokuB]

  51. if isRightSudoku(sudokuA):
  52.     print('Right')
  53. else:
  54.     print('Wrong')

  55.    
  56. if isRightSudoku(sudokuB):
  57.     print('Right')
  58. else:
  59.     print('Wrong')


  60. #  输出:
  61. #  Right
  62. #  Wrong
复制代码

评分

参与人数 1荣誉 +3 鱼币 +4 贡献 +3 收起 理由
kykio + 3 + 4 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 15:11:10 | 显示全部楼层    本楼为最佳答案   
我这跟据自己的思路写了个。参考下:

2018-03-15_150903.png

  1. '''
  2. 提起数独我想我们很多人都了解,也很喜欢玩。数独基于一个9X9的拉丁方。要求将数字1 至9 填入方格中,使之在每行每列都只出现一次。不过,它还有一条附加的要求。9X9的方格被切割成9个3X3的小方块。每个小方块中也都要包含数字1 到9。

  3. 5 8 1 4 9 3 7 6 2
  4. 9 6 3 7 1 2 5 8 4
  5. 2 7 4 8 6 5 9 3 1
  6. 1 2 9 5 4 6 3 7 8
  7. 4 3 6 1 8 7 2 9 5
  8. 7 5 8 3 2 9 1 4 6
  9. 8 9 2 6 7 1 4 5 3
  10. 6 1 5 9 3 4 8 2 7
  11. 3 4 7 2 5 8 6 1 9

  12. 1 2 3 4 5 6 7 8 9
  13. 2 3 4 5 6 7 8 9 1
  14. 3 4 5 6 7 8 9 1 2
  15. 4 5 6 7 8 9 1 2 3
  16. 5 6 7 8 9 1 2 3 4
  17. 6 7 8 9 1 2 3 4 5
  18. 7 8 9 1 2 3 4 5 6
  19. 8 9 1 2 3 4 5 6 7
  20. 9 1 2 3 4 5 6 7 8
  21. '''


  22. # 输入的字符串转换成列表
  23. def convertToList(row):
  24.     clist=[]
  25.     for each in row:
  26.         if each != ' ':
  27.             clist.append(int(each))
  28.     return clist

  29. def judge_sd(sd_list):
  30.     flag = 1
  31.     # 判断是否为拉丁方阵
  32.     for col in range(9):
  33.         temp = []
  34.         for row in sd_list:
  35.             if len(set(row)) != 9:
  36.                 flag = 0
  37.                 break
  38.             temp.append(row[col])

  39.         if flag == 0:
  40.             break
  41.             
  42.         if len(set(temp)) != 9:
  43.             flag = 0
  44.             break

  45.     # 如果是拉丁方阵,则判断是否为数独
  46.     if flag:   
  47.         for i in range(3):
  48.             for j in range(3):
  49.                 temp = []
  50.                 for r in range(3):
  51.                     for c in range(3):
  52.                         temp.append(sd_list[i*3+r][j*3+c])
  53.                 if len(set(temp)) != 9:
  54.                     flag = 0
  55.                     return flag # 返回并退出循环嵌套
  56.    
  57.         
  58.     return flag
  59.    
  60.             
  61. def judge_print(sd_list):
  62.     sd_num = len(sd_list)
  63.     for i in range(sd_num):
  64.         if judge_sd(sd_list[i]):
  65.             print("Right")
  66.         else:
  67.             print("Wrong")
  68.         
  69.             

  70. sd_list=[]
  71. sd_num=int(input("请输入数独数目:"))

  72. while(sd_num):
  73.     row = input()
  74.     temp = []
  75.     while(row !=''):
  76.         row = convertToList(row)
  77.         temp.append(row)
  78.         row = input()
  79.     sd_list.append(temp)

  80.     sd_num-=1

  81. judge_print(sd_list)


复制代码

评分

参与人数 1荣誉 +4 鱼币 +2 收起 理由
kykio + 4 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 16:56:44 | 显示全部楼层
  1. data = '''581493762
  2. 963712584
  3. 274865931
  4. 129546378
  5. 436187295
  6. 758329146
  7. 892671453
  8. 615934827
  9. 347258619'''

  10. list = data.split('\n')
  11. rw = 0
  12. def n():
  13.     global rw
  14.     for i in range(9):
  15.         aims = ['1','2','3','4','5','6','7','8','9','1','2','3','4','5','6','7','8','9']
  16.         for each in range(9):
  17.             try:
  18.                 aims.remove(list[i][each])
  19.                 aims.remove(list[each][i])
  20.             except ValueError:
  21.                 rw = 1
  22.                 break
  23.         if rw:
  24.             break

  25. def t():
  26.     global rw
  27.     for v in range(0,9,3):
  28.         for l in range(0,9,3):
  29.             for i in range(3):
  30.                 aims = ['1','2','3','4','5','6','7','8','9']
  31.                 for each in range(3):
  32.                     try:
  33.                         aims.remove(list[i + v][each + l])
  34.                     except ValueError:
  35.                         rw = 1
  36.                         break
  37.                 if rw:
  38.                     break
  39.             if rw:
  40.                 break
  41.         if rw:
  42.             break

  43. n()
  44. t()
  45. print('Wrong' if rw else 'Right')









  46.             
  47.         
复制代码


混经验
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-8 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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