求一条A到G的非重排列的算法写法。。

chi742658817 2018-09-04 03:47:12
如题,

只有大写的A-G之间的所有非重组合,1~7位的组合。。

例如:
A
B
C
D
E
F
G
AB
AC
AD
AE
AF
.........


这样,有大手吗。。
...全文
213 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chi742658817 2018-09-05
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
平时多注意收集常用算法,并整理成扩展
到需要用时就方便了
    static class Extend
{
/// <summary>
/// 笛卡尔积
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sequences"></param>
/// <returns></returns>
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] { item }));
}
/// <summary>
/// 组合
/// </summary>
/// <typeparam name="TValue"></typeparam>
/// <param name="values"></param>
/// <param name="num"></param>
/// <returns></returns>
public static IEnumerable<IEnumerable<TValue>> Combination<TValue>(
this IEnumerable<TValue> values,
// Int32 count,
Int32 num)
{
var t = Enumerable.Range(0, num).ToList();
do
{
yield return values.Where((x, i) => t.Contains(i));
}
while (NextCombination(t, values.Count(), num));
}
/// <summary>
/// C(n,m) 的下一项
/// </summary>
/// <param name="ar"></param>
/// <param name="num"></param>
/// <param name="k"></param>
/// <returns></returns>
public static bool NextCombination(List<int> ar, int n, int m)
{
if (ar.Count() != m) ar = Enumerable.Range(0, m).ToList();
bool changed = false, finished = false;
if (m > 0)
{
for (int i = m - 1; !changed && !finished; i--)
{
if (ar[i] < (n - 1) - (m - 1) + i)
{
ar[i]++;
if (i < m - 1)
{
for (int j = i + 1; j < m; j++)
{
ar[j] = ar[j - 1] + 1;
}
}
changed = true;
}
finished = (i == 0);
}
}
return changed;
}
public static IEnumerable<IEnumerable<TValue>> Permutation<TValue>(
this IEnumerable<TValue> values )
{
var t = Enumerable.Range(0, values.Count()).ToList();
var p = values.ToList();
do
{
yield return t.Select(i => p[i]);
}
while (NextPermutation(t));
}
/// <summary>
/// P(n) 的下一项
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static bool NextPermutation(List<int> a)
{
int first = 0;
int last = a.Count;
int c, j, m, n;

int i = last;
i--;
while (true)
{
var t = i;
i--;
if (a[i] < a[t])
{
j = last;
while (!(a[i] < a[--j])) ;
c = a[i];
a[i] = a[j];
a[j] = c;
m = t;
n = last - 1;
while (m < n)
{
c = a[n];
a[n] = a[m];
a[m] = c;
m++;
n--;
}
return true;
}
if (i == first)
{
m = first;
n = last - 1;
while (m < n)
{
c = a[n];
a[n] = a[m];
a[m] = c;
m++;
n--;
}
return false;
}
}
}
}
感谢。。
xuzuning 2018-09-04
  • 打赏
  • 举报
回复
平时多注意收集常用算法,并整理成扩展
到需要用时就方便了
    static class Extend
{
/// <summary>
/// 笛卡尔积
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sequences"></param>
/// <returns></returns>
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] { item }));
}
/// <summary>
/// 组合
/// </summary>
/// <typeparam name="TValue"></typeparam>
/// <param name="values"></param>
/// <param name="num"></param>
/// <returns></returns>
public static IEnumerable<IEnumerable<TValue>> Combination<TValue>(
this IEnumerable<TValue> values,
// Int32 count,
Int32 num)
{
var t = Enumerable.Range(0, num).ToList();
do
{
yield return values.Where((x, i) => t.Contains(i));
}
while (NextCombination(t, values.Count(), num));
}
/// <summary>
/// C(n,m) 的下一项
/// </summary>
/// <param name="ar"></param>
/// <param name="num"></param>
/// <param name="k"></param>
/// <returns></returns>
public static bool NextCombination(List<int> ar, int n, int m)
{
if (ar.Count() != m) ar = Enumerable.Range(0, m).ToList();
bool changed = false, finished = false;
if (m > 0)
{
for (int i = m - 1; !changed && !finished; i--)
{
if (ar[i] < (n - 1) - (m - 1) + i)
{
ar[i]++;
if (i < m - 1)
{
for (int j = i + 1; j < m; j++)
{
ar[j] = ar[j - 1] + 1;
}
}
changed = true;
}
finished = (i == 0);
}
}
return changed;
}
public static IEnumerable<IEnumerable<TValue>> Permutation<TValue>(
this IEnumerable<TValue> values )
{
var t = Enumerable.Range(0, values.Count()).ToList();
var p = values.ToList();
do
{
yield return t.Select(i => p[i]);
}
while (NextPermutation(t));
}
/// <summary>
/// P(n) 的下一项
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static bool NextPermutation(List<int> a)
{
int first = 0;
int last = a.Count;
int c, j, m, n;

int i = last;
i--;
while (true)
{
var t = i;
i--;
if (a[i] < a[t])
{
j = last;
while (!(a[i] < a[--j])) ;
c = a[i];
a[i] = a[j];
a[j] = c;
m = t;
n = last - 1;
while (m < n)
{
c = a[n];
a[n] = a[m];
a[m] = c;
m++;
n--;
}
return true;
}
if (i == first)
{
m = first;
n = last - 1;
while (m < n)
{
c = a[n];
a[n] = a[m];
a[m] = c;
m++;
n--;
}
return false;
}
}
}
}
chi742658817 2018-09-04
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
            var a = new[] { "A", "B", "C", "D", "E", "F", "G" };
for (var i = 1; i < 8; i++)
{
foreach (var x in a.Combination(i))
{
Console.WriteLine(string.Join("", x));
}
}
A
B
C
D
E
F
G
AB
AC
AD
AE
AF
AG
BC
BD
BE
BF
BG
CD
CE
CF
CG
DE
DF
DG
EF
EG
FG
ABC
ABD
ABE
ABF
ABG
ACD
ACE
ACF
ACG
ADE
ADF
ADG
AEF
AEG
AFG
BCD
BCE
BCF
BCG
BDE
BDF
BDG
BEF
BEG
BFG
CDE
CDF
CDG
CEF
CEG
CFG
DEF
DEG
DFG
EFG
ABCD
ABCE
ABCF
ABCG
ABDE
ABDF
ABDG
ABEF
ABEG
ABFG
ACDE
ACDF
ACDG
ACEF
ACEG
ACFG
ADEF
ADEG
ADFG
AEFG
BCDE
BCDF
BCDG
BCEF
BCEG
BCFG
BDEF
BDEG
BDFG
BEFG
CDEF
CDEG
CDFG
CEFG
DEFG
ABCDE
ABCDF
ABCDG
ABCEF
ABCEG
ABCFG
ABDEF
ABDEG
ABDFG
ABEFG
ACDEF
ACDEG
ACDFG
ACEFG
ADEFG
BCDEF
BCDEG
BCDFG
BCEFG
BDEFG
CDEFG
ABCDEF
ABCDEG
ABCDFG
ABCEFG
ABDEFG
ACDEFG
BCDEFG
ABCDEFG

大佬,Combination这个需要什么命名空间吗,是个什么函数。。我这里显示不包含这个定义。。
xuzuning 2018-09-04
  • 打赏
  • 举报
回复
            var a = new[] { "A", "B", "C", "D", "E", "F", "G" };
for (var i = 1; i < 8; i++)
{
foreach (var x in a.Combination(i))
{
Console.WriteLine(string.Join("", x));
}
}
A
B
C
D
E
F
G
AB
AC
AD
AE
AF
AG
BC
BD
BE
BF
BG
CD
CE
CF
CG
DE
DF
DG
EF
EG
FG
ABC
ABD
ABE
ABF
ABG
ACD
ACE
ACF
ACG
ADE
ADF
ADG
AEF
AEG
AFG
BCD
BCE
BCF
BCG
BDE
BDF
BDG
BEF
BEG
BFG
CDE
CDF
CDG
CEF
CEG
CFG
DEF
DEG
DFG
EFG
ABCD
ABCE
ABCF
ABCG
ABDE
ABDF
ABDG
ABEF
ABEG
ABFG
ACDE
ACDF
ACDG
ACEF
ACEG
ACFG
ADEF
ADEG
ADFG
AEFG
BCDE
BCDF
BCDG
BCEF
BCEG
BCFG
BDEF
BDEG
BDFG
BEFG
CDEF
CDEG
CDFG
CEFG
DEFG
ABCDE
ABCDF
ABCDG
ABCEF
ABCEG
ABCFG
ABDEF
ABDEG
ABDFG
ABEFG
ACDEF
ACDEG
ACDFG
ACEFG
ADEFG
BCDEF
BCDEG
BCDFG
BCEFG
BDEFG
CDEFG
ABCDEF
ABCDEG
ABCDFG
ABCEFG
ABDEFG
ACDEFG
BCDEFG
ABCDEFG

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧