| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1144 人关注过本帖
标题:求教行全排列
只看楼主 加入收藏
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
结帖率:73.44%
收藏
已结贴  问题点数:20 回复次数:14 
求教行全排列
先生您好,我现在碰到一个问题,是这样:想把一个7行5列的原表转换成行全排列的新表,7行按全排列应该有5040行。我的设想是这样:先把原表转移到二维内存,再将这个二维内存写入新表,但得不到全部的5040行,代码如下,请先生指教,谢谢

CLEAR
CLOSE  all
SET SAFETY OFF
DIMENSION YB(7,5)
USE 原表
select * from 原表 into array YB
 FOR i=1 TO 7
    FOR j=1 TO 5
      ?? YB(i,j)
   ENDFOR
  ?
  ENDFOR
 USE 行全排列表
 *-----------------------
 BH=0
  FOR i=1 TO 7
    APPEND BLANK
    BH=BH+1
    FOR j=1 TO 5                 
       REPLACE  编号 WITH  BH  
       REPLACE  ('列'+ALLTRIM(STR(j))) WITH  YB(i,j)                       
    ENDFOR  
  ENDFOR
  *-----------------------------
DELETE FILE *.bak
2014-12-22 12:18
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:0 
假设你的表T1有 A,B,C,D,E 5列,类型都一样。可以这样处理:

select 1 as 列号,recn() as 行号,A as 数据列 from T1
union all
select 2 as 列号,recn() as 行号,B as 数据列 from T1
union all
select 3 as 列号,recn() as 行号,C as 数据列 from T1
union all
select 4 as 列号,recn() as 行号,D as 数据列 from T1
union all
select 5 as 列号,recn() as 行号,E as 数据列 from T1

带上行号,列号,可以按你的另外的需求排序什么的。

[ 本帖最后由 hgfeng1984 于 2014-12-22 13:58 编辑 ]
2014-12-22 13:04
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:0 
以下是引用fdxxhjc在2014-12-22 12:18:02的发言:

先生您好,我现在碰到一个问题,是这样:想把一个7行5列的原表转换成行全排列的新表,7行按全排列应该有5040行。我的设想是这样:先把原表转移到二维内存,再将这个二维内存写入新表,但得不到全部的5040行,代码如下,请先生指教,谢谢
7行5列,共计占用35个单元格。如何能得到5040行,不解也?

只求每天有一丁点儿的进步就可以了
2014-12-22 14:43
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 2楼 hgfeng1984
先生是我没表达清楚:是这样的要求,原表有7行
列1    列2    列3    列4    列5
43    22    3    5    1
101    11    82    6    0
97    41    31    52    66
9    0    5    9    20
64    4    22    79    32
88    1    64    35    76
68    211    8    88    78
现在任意交换整行(可以是任意交换2行或3行或4行...直至7行),行的次序与原表行次序不一样就算一种新情况,据数学中的排列定理可得这样的和原表行次序不同的所有情况共有720种,现在要求把这720种情况记录到新表中,每种之间用一个空行隔开,如下只是交换6、7行一种和交换5、6行一种的两种情况
列1    列2    列3    列4    列5
43     22     3     5     1
101     11     82     6     0
97     41     31     52     66
9     0     5     9     20
64     4     22     79     32
68     211     8     88     78
88     1     64     35     76
               
43     22     3     5     1
101     11     82     6     0
97     41     31     52     66
9     0     5     9     20
88     1     64     35     76
64     4     22     79     32
68     211     8     88     78

谢谢
2014-12-22 15:37
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:10 
程序代码:
Create Cursor tt (x C(1))
For lnI=1 to 7
    Insert into tt values (Chr(64+lnI))
EndFor 
Select a.x+","+b.x+","+c.x+","+d.x+","+e.x+","+f.x+","+g.x h from tt a ;
inner join tt b on not InList(b.x,a.x) ;
inner join tt c on not InList(c.x,a.x,b.x) ;
inner join tt d on not InList(d.x,a.x,b.x,c.x) ;
inner join tt e on not InList(e.x,a.x,b.x,c.x,d.x) ;
inner join tt f on not InList(f.x,a.x,b.x,c.x,d.x,e.x) ;
inner join tt g on not InList(g.x,a.x,b.x,c.x,d.x,e.x,f.x) into cursor temp
Select * from 原表 where .f. into cursor 新表 readwrite

Select Chr(64+Recno()) bz,* from 原表 into cursor yb
Select temp
Scan
    =ALines(ab,h,",")
    For lni=1 to ALines(ab,h,",")
        Insert into 新表 select 列1,列2,列3,列4,列5 from yb where bz==ab[lni]
    endfor
    Insert into 新表 (列1) values (0)
EndScan
Select 新表
browse
收到的鲜花
  • fdxxhjc2014-12-23 09:10 送鲜花  3朵   附言:好文章

坚守VFP最后的阵地
2014-12-22 16:04
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用fdxxhjc在2014-12-22 12:18:02的发言:

先生您好,我现在碰到一个问题,是这样:想把一个7行5列的原表转换成行全排列的新表,7行按全排列应该有5040行。我的设想是这样:先把原表转移到二维内存,再将这个二维内存写入新表,但得不到全部的5040行,代码如下,请先生指教,谢谢

CLEAR
CLOSE  all
SET SAFETY OFF
DIMENSION YB(7,5)
USE 原表
select * from 原表 into array YB
 FOR i=1 TO 7
    FOR j=1 TO 5
      ?? YB(i,j)
   ENDFOR
  ?
  ENDFOR
 USE 行全排列表
 *-----------------------
 BH=0
  FOR i=1 TO 7
    APPEND BLANK
    BH=BH+1
    FOR j=1 TO 5                 
       REPLACE  编号 WITH  BH  
       REPLACE  ('列'+ALLTRIM(STR(j))) WITH  YB(i,j)                       
    ENDFOR  
  ENDFOR
  *-----------------------------
DELETE FILE *.bak
也许是超出了数组的师大容量吧。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-12-22 16:32
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
回复 4楼 fdxxhjc
7全排列=7*6*5*4*3*2*1=5040
5040*7行=35280行


2014-12-22 18:02
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:10 
我这里不讨论算法,只是为了得出结果:
CLOSE DATABASES
CREATE CURSOR 原表 (a c(2),b c(2),c c(2),d c(2),e c(2))
INSERT INTO 原表 (a,b,c,d,e) VALUES ('1','B','C','D','E')
INSERT INTO 原表 (a,b,c,d,e) VALUES ('2','B','C','D','E')
INSERT INTO 原表 (a,b,c,d,e) VALUES ('3','B','C','D','E')
INSERT INTO 原表 (a,b,c,d,e) VALUES ('4','B','C','D','E')
INSERT INTO 原表 (a,b,c,d,e) VALUES ('5','B','C','D','E')
INSERT INTO 原表 (a,b,c,d,e) VALUES ('6','B','C','D','E')
INSERT INTO 原表 (a,b,c,d,e) VALUES ('7','B','C','D','E')
GO TOP IN 原表

SELECT * FROM 原表 INTO CURSOR 新表 WHERE .f. READWRITE  &&原表可换你的表

FOR I1=1 TO 7
    FOR I2=1 TO 7
        IF i2<>i1
            FOR I3=1 TO 7
                IF i3<>i2 AND i3<>i1
                    FOR I4=1 TO 7
                        IF i4<>i3 AND i4<>i2 AND i4<>i1
                            FOR I5=1 TO 7
                                IF i5<>i4 AND i5<>i3 AND i5<>i2 AND i5<>i1
                                    FOR I6=1 TO 7
                                        IF i6<>i5 AND i6<>i4 AND i6<>i3 AND i6<>i2 AND i6<>i1
                                            FOR I7=1 TO 7
                                                IF i7<>i6 AND i7<>i5 AND i7<>i4 AND i7<>i3 AND i7<>i2 AND i7<>i1
                                                    INSERT INTO 新表 SELECT * FROM 原表 WHERE RECNO()=I1
                                                    INSERT INTO 新表 SELECT * FROM 原表 WHERE RECNO()=I2
                                                    INSERT INTO 新表 SELECT * FROM 原表 WHERE RECNO()=I3
                                                    INSERT INTO 新表 SELECT * FROM 原表 WHERE RECNO()=I4
                                                    INSERT INTO 新表 SELECT * FROM 原表 WHERE RECNO()=I5
                                                    INSERT INTO 新表 SELECT * FROM 原表 WHERE RECNO()=I6
                                                    INSERT INTO 新表 SELECT * FROM 原表 WHERE RECNO()=I7
                                                    APPEND BLANK IN 新表
                                                ENDIF
                                            ENDFOR
                                        ENDIF
                                    ENDFOR
                                ENDIF
                            ENDFOR
                        ENDIF
                    ENDFOR
                ENDIF
            ENDFOR
        ENDIF
    ENDFOR
ENDFOR
SELECT 新表
BROWSE
收到的鲜花
  • fdxxhjc2014-12-23 09:12 送鲜花  3朵   附言:好文章
2014-12-22 18:04
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 7楼 kiff
先生您好,首先感谢您的教导,您的程序我已学习,但运行下来所得的新表只是在屏幕上可以浏览,没有真正写入到新表中(当我退出系统再打开新表时新表是空文件),请教先生如何修改才能将交换的结果真正写入到新表中,谢谢先生!
2014-12-23 09:09
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 8楼 kiff
先生您好,首先感谢您的教导,您的程序我已学习,但运行下来所得的新表只是在屏幕上可以浏览,没有真正写入到新表中(当我退出系统再打开新表时新表是空文件),请教先生如何修改才能将交换的结果真正写入到新表中,谢谢先生!
2014-12-23 09:09
快速回复:求教行全排列
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036461 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved