主题:帮忙给个算法
pascal玩家
[专家分:280] 发布于 2008-07-05 21:11:00
问题描述
任给出4个非0的不同数字,求出由这4个数字组成的所有的4位数。
例如:
输入:3,2,1,6
输出:1 2 3 6 1 2 6 3 1 3 2 6 1 3 6 2 1 6 2 3 1 6 3 2
2 1 3 6 2 1 6 3 2 3 1 6 2 3 6 1 2 6 1 3 2 6 3 1
3 1 2 6 3 1 6 2 3 2 1 6 3 2 6 1 3 6 1 2 3 6 2 1
6 1 2 3 6 1 3 2 6 2 1 3 6 2 3 1 6 3 1 2 6 3 2 1
程序要求:从键盘输入4个不同的非0数字,列出由这4个数字组成的所有4位数,每行输出6个。
回复列表 (共11个回复)
沙发
Mato完整版 [专家分:1270] 发布于 2008-07-06 10:23:00
四重循环i[1]、i[2]、i[3]、i[4],每个从1到4,若四个不相同则输出。
板凳
Mato完整版 [专家分:1270] 发布于 2008-07-06 10:23:00
程序:
{$N+}
TYPE
{Integer type declare}
I_ = INTEGER;
SI_ = SHORTINT;
LI_ = LONGINT;
BI_ = BYTE;
WI_ = WORD;
{Real type declare}
R_ = REAL;
SR_ = SINGLE;
DR_ = DOUBLE;
ER_ = EXTENDED;
CR_ = COMP;
{Other type declare}
C_ = CHAR;
B_ = BOOLEAN;
S_ = STRING;
VAR
a, i: ARRAY[1..4] OF SI_;
j, k: SI_;
BEGIN
k := 0;
FOR j:=1 TO 4 DO READ(a[j]);
FOR i[1]:=1 TO 4 DO
FOR i[2]:=1 TO 4 DO
FOR i[3]:=1 TO 4 DO
FOR i[4]:=1 TO 4 DO
IF (.i[1], i[2], i[3], i[4].) = (.1, 2, 3, 4.) THEN BEGIN
FOR j:=1 TO 4 DO WRITE(a[i[j]]);
WRITE(' ');
INC(k);
IF k MOD 6 = 0 THEN WRITELN;
END;
END.
3 楼
pascal玩家 [专家分:280] 发布于 2008-07-06 12:42:00
那如果读入一个不知道多少位的数呢?
4 楼
Mato完整版 [专家分:1270] 发布于 2008-07-06 12:51:00
用WHILE:
{$N+}
TYPE
{Integer type declare}
I_ = INTEGER;
SI_ = SHORTINT;
LI_ = LONGINT;
BI_ = BYTE;
WI_ = WORD;
{Real type declare}
R_ = REAL;
SR_ = SINGLE;
DR_ = DOUBLE;
ER_ = EXTENDED;
CR_ = COMP;
{Other type declare}
C_ = CHAR;
B_ = BOOLEAN;
S_ = STRING;
VAR
s: S_; k: BI_; {由于这个数不知道多少位,所以用字符串}
PROCEDURE inputnum;
VAR
c: C_;
BEGIN
WHILE (TRUE) DO BEGIN
WRITE('Input a integer(0--9), input A will stop');
READLN(c);
IF c = 'A' THEN BREAK;
INC(k); s := s + c;
END;
END;
{k为位数,输入A结束}
5 楼
pascal玩家 [专家分:280] 发布于 2008-07-06 14:59:00
能用回溯做么?
6 楼
小田甜 [专家分:3910] 发布于 2008-07-06 16:13:00
有没有人知道Martian(NOIP普及组05?我不记得了)这道题目???
一样的。
只需要求下一个就可以了。
第一个:全部升序
下一个:从右向左第一个出现两个相临数字前面的小的时候把这两个颠倒位置,然后把后面的排成升序。
7 楼
Mato完整版 [专家分:1270] 发布于 2008-07-06 20:41:00
求N个数的全排列,就是每个数就从1-N中搜索,如果和前面的不同就记上。
关键就是求这个数是不是和以前的不同的方法。最好设一个布尔数组isfind,isfind[i] = TRUE表示i已经用过了,不能再用了,否则表示i还没用过。搜索到一个数后,如果isfind[这个数] = FALSE,就表示它和前面的不相同。
程序详见你的八皇后问题的我的回复(5楼)。
8 楼
Mato完整版 [专家分:1270] 发布于 2008-07-06 20:52:00
这题也可以用集合做。
程序:
{$N+}
TYPE
{Integer type declare}
I_ = INTEGER;
SI_ = SHORTINT;
LI_ = LONGINT;
BI_ = BYTE;
WI_ = WORD;
{Real type declare}
R_ = REAL;
SR_ = SINGLE;
DR_ = DOUBLE;
ER_ = EXTENDED;
CR_ = COMP;
{Other type declare}
C_ = CHAR;
B_ = BOOLEAN;
S_ = STRING;
VAR
a: ARRAY[1..255] OF BI_;
s: SET OF BI_;
n: BI_;
sum: LI_;
PROCEDURE p1(i: BI_);
VAR
j, k: I_;
BEGIN
FOR j:=1 TO n DO
IF NOT (j IN s) THEN BEGIN
a[i] := j;
s := s + (.j.);
IF i = n THEN BEGIN
FOR k:=1 TO n DO WRITE(a[k]:5);
WRITELN; INC(sum);
END ELSE
p1(i + 1)
;
s := s - (.j.);
END;
END;
BEGIN
s := (..);
READLN(n);
p1(1);
WRITELN(sum);
END.
9 楼
pascal玩家 [专家分:280] 发布于 2008-07-06 20:54:00
{$N+}
TYPE
{Integer type declare}
I_ = INTEGER;
SI_ = SHORTINT;
LI_ = LONGINT;
BI_ = BYTE;
WI_ = WORD;
{Real type declare}
R_ = REAL;
SR_ = SINGLE;
DR_ = DOUBLE;
ER_ = EXTENDED;
CR_ = COMP;
{Other type declare}
C_ = CHAR;
B_ = BOOLEAN;
S_ = STRING;
这一段是什么意思?
10 楼
Mato完整版 [专家分:1270] 发布于 2008-07-06 20:57:00
我把这一段复制到一个文件里,以后只要编程就打开这个文件,把里面的内容装到程序里,然后我在定义类型时就可以少打几个字了。
不过这只是个人习惯,没关系的。
我来回复