鱼C论坛

 找回密码
 立即注册
查看: 5205|回复: 12

[已解决]一个关于生成矩阵的问题

[复制链接]
发表于 2016-3-13 15:09:41 | 显示全部楼层 |阅读模式

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

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

x
要求:给定n,k两个值。生成一个k行n列的矩阵。每一行的元素都是从1到n的。
其中每一行中的元素不能有重复的数字,每一列中的元素也不能有重复的数字。
而且还有个要求:每一列不能出现所在列的那一个数字。比如第一列中就不能出现数字1  第二列就不能出现数字2等等。。

例如 一个k=2,n=5的矩阵 (2*5的矩阵
必须是 (1 2 3 4 5)(表示列的数字,不是矩阵里面的)
              2  3  4  5  1
              3  1  5  2  4
这样的形式。

结果可以用一个列表或多个列表表示都没关系。。。

题主写了一个不满足最后一个要求的(实在想不到,先简化了一下),但是效率实在低下啊。生成一个10*10的矩阵都要很久。。。

哪位大神有好一点的方法??求指导啊!!

最佳答案
2016-3-13 20:55:12
想了挺久写了如下代码
但是还是有bug,在一定情况下会出现死循环,等我这两天再想想怎么解决
或者你有没有什么好的算法,我这个就是让计算机暴力破解
  1. import random
  2. k = int(input("请输入有多少行:"))
  3. n = int(input("请输入有多少列:"))

  4. def shuzu():
  5.     sum = []

  6.     for i in range(k):
  7.         #print(sum)
  8.         num = [x+1 for x in range(n)]

  9.         num_copy = num[:]
  10.         sum.append([])
  11.         
  12.         for j in range(n):
  13.             num_copy = num[:]
  14.             
  15.             if j+1 in num_copy:
  16.                 num_copy.remove(j+1)
  17.             
  18.             for each in range(i):
  19.                 if sum[each][j] in num_copy:
  20.                     num_copy.remove(sum[each][j])

  21.             #print(num_copy)
  22.             if num_copy == []:
  23.                 shuzu()
  24.             #choice = num_copy.pop()

  25.             choice = random.choice(num_copy)
  26.             #print(choice)

  27.             sum[i].append(choice)
  28.             num.remove(choice)

  29.     for each_line in sum:
  30.         print(each_line)
  31.                
  32. shuzu()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-3-13 20:55:12 | 显示全部楼层    本楼为最佳答案   
想了挺久写了如下代码
但是还是有bug,在一定情况下会出现死循环,等我这两天再想想怎么解决
或者你有没有什么好的算法,我这个就是让计算机暴力破解
  1. import random
  2. k = int(input("请输入有多少行:"))
  3. n = int(input("请输入有多少列:"))

  4. def shuzu():
  5.     sum = []

  6.     for i in range(k):
  7.         #print(sum)
  8.         num = [x+1 for x in range(n)]

  9.         num_copy = num[:]
  10.         sum.append([])
  11.         
  12.         for j in range(n):
  13.             num_copy = num[:]
  14.             
  15.             if j+1 in num_copy:
  16.                 num_copy.remove(j+1)
  17.             
  18.             for each in range(i):
  19.                 if sum[each][j] in num_copy:
  20.                     num_copy.remove(sum[each][j])

  21.             #print(num_copy)
  22.             if num_copy == []:
  23.                 shuzu()
  24.             #choice = num_copy.pop()

  25.             choice = random.choice(num_copy)
  26.             #print(choice)

  27.             sum[i].append(choice)
  28.             num.remove(choice)

  29.     for each_line in sum:
  30.         print(each_line)
  31.                
  32. shuzu()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 21:03:19 | 显示全部楼层
shuofxz 发表于 2016-3-13 20:55
想了挺久写了如下代码
但是还是有bug,在一定情况下会出现死循环,等我这两天再想想怎么解决
或者你有没 ...

先谢谢大神的回答啊~我也是暴力运算的,所以才会导致我写的结果非常的慢。。。我是初学者,有些技巧还不是很熟练!我也正在思考好的办法,如果有想法会第一时间发上来的!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 21:14:55 | 显示全部楼层
shuofxz 发表于 2016-3-13 20:55
想了挺久写了如下代码
但是还是有bug,在一定情况下会出现死循环,等我这两天再想想怎么解决
或者你有没 ...

当k>n的时候好像会出现死循环吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-13 22:04:12 | 显示全部楼层
Liu_xy 发表于 2016-3-13 21:14
当k>n的时候好像会出现死循环吧?

k≥n时不成立,比如n=k=2则
2 1
1 2
不符合每一列不能出现所在列的那一个数字。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-13 22:05:37 | 显示全部楼层
冬雪雪冬 发表于 2016-3-13 22:04
k≥n时不成立,比如n=k=2则
2 1
1 2

嗯,我也发现了。应该再加一个k<n的前提~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-13 22:25:28 | 显示全部楼层
是给出一种答案,还是要所有可能的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-14 07:03:12 | 显示全部楼层
冬雪雪冬 发表于 2016-3-13 22:25
是给出一种答案,还是要所有可能的。

给出一种答案就行,不需要所有可能~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-14 12:12:07 | 显示全部楼层
不知是否我理解有误,应该很简单的。
  1. n = 5
  2. k = 4
  3. list1 = [[] for i in range(k)]

  4. for k1 in range(k):
  5.     for n1 in range(n):
  6.         list1[k1].append((k1 + n1 + 1) % n + 1)
  7. for i in list1:
  8.     print(i)
复制代码


结果:
  1. [2, 3, 4, 5, 1]
  2. [3, 4, 5, 1, 2]
  3. [4, 5, 1, 2, 3]
  4. [5, 1, 2, 3, 4
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
shuofxz + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-3-14 12:38:59 | 显示全部楼层
冬雪雪冬 发表于 2016-3-14 12:12
不知是否我理解有误,应该很简单的。

额。。。要求随机吧。。。这种方法虽然也符合但是不随机呀~
必须每一次输出都是随机的~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-14 12:46:22 | 显示全部楼层
冬雪雪冬 发表于 2016-3-14 12:12
不知是否我理解有误,应该很简单的。

这样确实是可以生成一组满足要求的数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-14 12:46:25 | 显示全部楼层
冬雪雪冬 发表于 2016-3-14 12:12
不知是否我理解有误,应该很简单的。

这样确实是可以生成一组满足要求的数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-16 15:39:58 | 显示全部楼层
shuofxz 发表于 2016-3-13 20:55
想了挺久写了如下代码
但是还是有bug,在一定情况下会出现死循环,等我这两天再想想怎么解决
或者你有没 ...

请问有想到解决办法吗??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-20 04:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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