这个叫排列,不叫排序方法很简单,就是用递归:void Main() { for (i = 1; i < 9; i++) p(i.ToString()); }void p(string s) { for (int i = 1; i <= 9; i++) { if (s.SubString(s.Length - 1) != i.ToString()) { if (s.Length > 8) Console.WriteLine(s += i.ToString()); else p(s += i.ToString()); } } }
其实数字是一个特例,也可以直接循环: int[] has = {0, 0, 0, 0, 0, 0, 0, 0, 0}; for (long i = 123456789; i <= 987654321; i++) { string s = i.ToString(); for (int j = 0; j < 9; j++) has[i] = 0; for (int j = 0; j < 9; j++) { if (has[Convert.ToInt32(s.SubString(i, 1))] == 1) goto Skip: ; has[Convert.ToInt32(s.SubString(i, 1))] = 1; } Console.WriteLine(s); Skip:
}
本帖最后由 caozhy 于 2011-03-30 08:48:18 编辑
for (int i = 123456789; i < 987654322; i++) { char[] a; Array.Sort(a = i.ToString().ToCharArray()); if (new string(a)=="123456789") { Console.WriteLine(i); } }代码够短吧...也很好理解,至于效率嘛... 呵呵呵呵
{
for (i = 1; i < 9; i++)
p(i.ToString());
}void p(string s)
{
for (int i = 1; i <= 9; i++)
{
if (s.SubString(s.Length - 1) != i.ToString())
{
if (s.Length > 8)
Console.WriteLine(s += i.ToString());
else
p(s += i.ToString());
}
}
}
int[] has = {0, 0, 0, 0, 0, 0, 0, 0, 0};
for (long i = 123456789; i <= 987654321; i++)
{
string s = i.ToString();
for (int j = 0; j < 9; j++) has[i] = 0;
for (int j = 0; j < 9; j++) {
if (has[Convert.ToInt32(s.SubString(i, 1))] == 1) goto Skip: ;
has[Convert.ToInt32(s.SubString(i, 1))] = 1;
}
Console.WriteLine(s);
Skip:
}
{
char[] a;
Array.Sort(a = i.ToString().ToCharArray());
if (new string(a)=="123456789")
{
Console.WriteLine(i);
}
}代码够短吧...也很好理解,至于效率嘛... 呵呵呵呵
void Main()
{
Dictionary<string, int> dic = new Dictionary<string, int>();
for (int i = 0; i < m_Data.Length; i++)
{
Console.WriteLine(m_Data[i]);
dic.Add(m_Data[i], i);
}
GetString(dic);
}
static string[] m_Data = Enumerable.Range(1,9).Select(s=>s.ToString()).ToArray();
static void GetString(Dictionary<string,int> dd)
{
Dictionary<string, int> dic = new Dictionary<string, int>();
foreach (KeyValuePair<string, int> kv in dd)
{
for (int i = kv.Value + 1; i < m_Data.Length; i++)
{
Console.WriteLine(kv.Key + m_Data[i]);
dic.Add(kv.Key + m_Data[i], i);
}
}
if(dic.Count>0) GetString(dic);
}
/*
1
2
3
4
5
6
7
8
9
12
13
14
15
16
17
18
19
23
24
25
26
27
28
29
34
35
36
37
38
39
45
46
47
48
49
56
57
58
59
67
68
69
78
79
89
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
456
457
458
459
467
468
469
478
479
489
567
568
569
578
579
589
678
679
689
789
1234
1235
1236
1237
1238
1239
1245
1246
1247
1248
1249
1256
1257
1258
1259
1267
1268
1269
1278
1279
1289
1345
1346
1347
1348
1349
1356
1357
1358
1359
1367
1368
1369
1378
1379
1389
1456
1457
1458
1459
1467
1468
1469
1478
1479
1489
1567
1568
1569
1578
1579
1589
1678
1679
1689
1789
2345
2346
2347
2348
2349
2356
2357
2358
2359
2367
2368
2369
2378
2379
2389
2456
2457
2458
2459
2467
2468
2469
2478
2479
2489
2567
2568
2569
2578
2579
2589
2678
2679
2689
2789
3456
3457
3458
3459
3467
3468
3469
3478
3479
3489
3567
3568
3569
3578
3579
3589
3678
3679
3689
3789
4567
4568
4569
4578
4579
4589
4678
4679
4689
4789
5678
5679
5689
5789
6789
12345
12346
12347
12348
12349
12356
12357
12358
12359
12367
12368
12369
12378
12379
12389
12456
12457
12458
12459
12467
12468
12469
12478
12479
12489
12567
12568
12569
12578
12579
12589
12678
12679
12689
12789
13456
13457
13458
13459
13467
13468
13469
13478
13479
13489
13567
13568
13569
13578
13579
13589
13678
13679
13689
13789
14567
14568
14569
14578
14579
14589
14678
14679
14689
14789
15678
15679
15689
15789
16789
23456
23457
23458
23459
23467
23468
23469
23478
23479
23489
23567
23568
23569
23578
23579
23589
23678
23679
23689
23789
24567
24568
24569
24578
24579
24589
24678
24679
24689
24789
25678
25679
25689
25789
26789
34567
34568
34569
34578
34579
34589
34678
34679
34689
34789
35678
35679
35689
35789
36789
45678
45679
45689
45789
46789
56789
123456
123457
123458
123459
123467
123468
123469
123478
123479
123489
123567
123568
123569
123578
123579
123589
123678
123679
123689
123789
124567
124568
124569
124578
124579
124589
124678
124679
124689
124789
125678
125679
125689
125789
126789
134567
134568
134569
134578
134579
134589
134678
134679
134689
134789
135678
135679
135689
135789
136789
145678
145679
145689
145789
146789
156789
234567
234568
234569
234578
234579
234589
234678
234679
234689
234789
235678
235679
235689
235789
236789
245678
245679
245689
245789
246789
256789
345678
345679
345689
345789
346789
356789
456789
1234567
1234568
1234569
1234578
1234579
1234589
1234678
1234679
1234689
1234789
1235678
1235679
1235689
1235789
1236789
1245678
1245679
1245689
1245789
1246789
1256789
1345678
1345679
1345689
1345789
1346789
1356789
1456789
2345678
2345679
2345689
2345789
2346789
2356789
2456789
3456789
12345678
12345679
12345689
12345789
12346789
12356789
12456789
13456789
23456789
123456789*/
{
1,2,4,8,16,32,64,128,256,512
}
各种翻转变换。
Console.WriteLine(i);
为了验证方便,算法里描述了1,2,3三个的情况,体现下思路
思路:用二维数组char[3][],放三行数据,首行'1','2','3'三列;第二行'2','3'两列,第三行'3'一列,排列时,每行出一个元素,就是一个排列结果,穷举法
static void Main()
{
char[][] a=new char[3][]; //3行字符,但列逐渐减少,此处首行'1','2','3'三列;第二行'2','3'两列,第三行'3'一列
for(int i=0;i<3;i++) //创建存放行的数组
a[i]=new char[3-i];
for (int i = 0; i < a[0].Length; i++) //初始化存放行的数组,首行'1','2','3'
a[0][i] = Convert.ToChar(i + 1+48);
char[] result = new char[3]; //存放一次排列完成后结果
for (int r1 = 0; r1 < a[0].Length; r1++) //开始排序
{
result[0]=(a[0][r1]);
OutOne(1, a, a[0][r1]);
for (int r2 = 0; r2 < a[1].Length; r2++)
{
result[1] = (a[1][r2]);
OutOne(2, a, a[1][r2]);
for (int r3 = 0; r3 < a[2].Length; r3++)
{
result[2] = a[2][r3];
Console.WriteLine(new String(result));
}
}
}
Console.ReadLine();
}
static void OutOne(int p_index, char[][] p_array, char c) //p_index当前行号,Up_Index上一行的行号,当前行存放的是:在上一行里去掉c后的结果
{
int Up_Index = p_index - 1;
int i;
for (i = 0; i < p_array[Up_Index].Length-1 && p_array[Up_Index][i] != c; i++)
p_array[p_index][i] = p_array[Up_Index][i];
for (; i < p_array[Up_Index].Length - 1;i++ )
p_array[p_index][i] = p_array[Up_Index][i + 1]; }
一看就有规律,可以改写成递归法,大家一起改吧
其实第二、三行不一定是行'2','3'和行'3',如果第一行出的是2,那么第二行就是1,3;若第一行出的是3,第二行就是,1,2,依次类推
同理,第三行是第二行 出 一个后,剩下的
就是函数OutOne()描述的功能