回 帖 发 新 帖 刷新版面

主题:tjoj1002

Problem
将一个字符组全排序

Input
一个长度小于10的字符串,该字符串由数字1~9组成。字符不会重复出现。

Output
按数字在输入串中出现的次序从小到大的顺序输出该字符组的全排序

Sample Input
132

Sample Output
1 3 2
1 2 3
3 1 2
3 2 1
2 1 3
2 3 1

怎么想都想不出来

回复列表 (共9个回复)

沙发

可以用组合数学里讲的排列生成法,也可以直接搜索

板凳

我曾看过一个楼上提到的排列生成法的程序,逻辑上比较乱。所以使用深搜即可。

3 楼

我还没学数结,能告诉我怎么排列吗

4 楼

汗……对于这道题是搜索就可以的了,但是规模一大,搜索就……呵呵……
我试验过,我写的生成排列比搜索生成快10倍以上。

楼上的,用递归写深搜,不需要什么复杂的数据结构(用递归就不必自己弄栈)

5 楼

// 给出一个求全排序的方法,貌似比 dfs 好不少

program _;
const maxn = 100;
var
  i,j,m,t:integer;
  p:array[1..maxn] of integer;
  count:integer;
begin
  readln(m);
  for i:= 1 to m do p[i] := i; write(i); end;
  writeln;
  repeat
    i := m;
    while (i>1) and (p[i-1]>=p[i]) do dec(i);
    if i = 1 then break;
    j := m;
    while (j>0) and (p[i-1]>p[j]) do dec(j);
    if j = 0 then break;
    t := p[i-1]; p[i-1] := p[j]; p[j] := t;
    for j := 1 to (m-i+1) div 2 do begin
      t := p[i+j-1]; p[i+j-1] := p[i+j-1] := p[m-j+1]; p[m-j+1] := t;
    end;
    for i := 1 to m do write(p[i]);
    writeln;
  until false;
end.

6 楼

郁闷ing
做是做了,就是Wrong Answer,我自己怎么看都是对的呀!

7 楼

我这个没有考虑 ACM,他的多组数据和输出格式我这里都没有顾及。

8 楼

我也用DFS呀,Wrong Answer...

9 楼

var
  s     :array[1..9]of integer;
  u     :array[1..9]of boolean;
  str   :string;
  n     :integer;
procedure print;
var
  i     :integer;
begin
  for i:=1 to n-1 do
    write(str[s[i]],' ');
  writeln(str[s[n]]);
end;

procedure dfs(d:integer);
var
  i     :integer;
begin
  for i:=1 to n do
    if not u[i] then
      begin
        u[i]:=true;
        s[d]:=i;
        if d=n then print else dfs(d+1);
        u[i]:=false;
      end;
end;

{=======main=======}
begin
  readln(str);
  n:=length(str);
  dfs(1);
end.


WA?汗……
这个是AC的DFS程序,很简单的……

我来回复

您尚未登录,请登录后再回复。点此登录或注册