C# 实现全排列

今天看论坛,看到有个求助,要求不要for或while,实现全排列。感觉很有难度,自己试了一下,还真不能省略for。

代码编写完成后,感觉很“Ugly”,以前看过一篇文章,好像是说编程的思想跟艺术,现在有点体会到了。

同样是实现某种功能,艺术的编程,程序的整体布局,之间接口对象的设计,各种知识的运用,一气呵成,增一份则肥,减一份则瘦,浑然天成。对比起那种境界,我的只能称为涂鸦式了,缝缝补补的,磕磕撞撞的。

要把编程变成一种艺术,还真是路漫漫兮。

 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Collections;
using  System.IO;

namespace  Date1219
{
    
class NumArrangement
    
{
        
/// <summary>
        
/// 实现任意输入字符串的全排列
        
/// 
        
/// 如输入“ABC”会得到6组全排,输入“ABCD”得到24组全排
        
/// 
        
/// 程序利用了插位的思路,递归排列。
        
/// 
        
/// 编程中,印象比较深刻的是,Arraylist的深层拷贝问题,正确使用拷贝将使代码大为精炼直观。
        
/// 具体技术参考了http://topic.csdn.net/t/20051026/10/4350726.html 里面的内容。
        
/// </summary>
        
/// <param name="str"></param>
        
/// <returns></returns>

        public ArrayList Arrange(string str)
        
{
            ArrayList list 
= new ArrayList();
            
for (int i = 0; i < str.Length; i++)
            
{
                list 
= InsertValue(str[i].ToString(), list);
            }

            
return list;
        }


        
public ArrayList InsertValue(string str, ArrayList list)
        
{
            
int rowct = list.Count;
            
int rayct;

            ArrayList list2 
= new ArrayList();

            
if (list.Count >0)
            
{
                ArrayList temp 
= (ArrayList)list[0];
                rayct 
= temp.Count;

                
for (int i = 0; i < rowct; i++)
                
{
                    
for (int j = 0; j < rayct+1; j++)
                    
{
                        ArrayList list4 
= new ArrayList((ArrayList)list[i]);//Arraylist 的深度复制
                        
                        list4.Insert(j, str);
                        list2.Add(list4);
                    }

                }


            }

            
else
            
{
                 rayct 
= 0;
                 list.Add(str);
                 list2.Add(list);
            }

            
            
return list2;
        }


        
//打印
        public void PrintList(ArrayList list)
        
{
            
for (int i = 0; i < list.Count; i++)
            
{
                ArrayList list2 
= (ArrayList)list[i];
                
for (int j = 0; j < list2.Count; j++)
                
{
                    Console.Write(list2[j] 
+ " ");
                }

                Console.WriteLine();
            }

            Console.ReadLine();
        }

    }


    
class Test
    
{
        
public static void Main(String[] args)
        
{
            NumArrangement na 
= new NumArrangement();

            
//交互界面
            Console.WriteLine("Input your Num:");
            
string input = Console.ReadLine();
            Console.WriteLine(
"Your Number Arrangement:");

            ArrayList list 
= na.Arrange(input);
            na.PrintList(list);
            
        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值