一个和顺序排列有关的算法问题

zifeng759 2009-12-15 02:38:03
初始数据:
A B -->A在B前面
F A -->F在A前面
G F
M F
L M
Q M
P F
C D
D E

文字描述:
每组两个字符,前后是有顺序的,现在要求:
根据他们的两两关系列出所有不违背以上顺序的可能的字符串。
AB,
FA,
GF,
MF,
LM,
QM,
PF,
CD,
DE,
FAB,FB,
FAC,FC,
……
...全文
157 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zifeng759 2009-12-22
  • 打赏
  • 举报
回复
sorry
一直忙没来看,
前面只要回答的都给分,
把帖子结了然后我有时间慢慢看,
谢谢诸位
cena_jin 2009-12-18
  • 打赏
  • 举报
回复
学习学习!!!!!学习学习!!!!!
assiwe 2009-12-18
  • 打赏
  • 举报
回复
public class Class1
{
string[] code = { "AB", "FA", "GF", "MF", "LM", "QM", "PF", "CD", "DE", "FB", "FC" };
ArrayList arr;
public Class1() {
arr = new ArrayList();

}


private void cospt(string str) {
foreach (string s in code) {

if (str.Substring(str.Length-1) == s.Substring(0, 1))
{
string b=str + s.Substring(1, 1);
arr.Add(b);
cospt(b);
}

}

}
public ArrayList getArray(){
string[] code = { "AB", "FA", "GF", "MF", "LM", "QM", "PF", "CD", "DE", "FB", "FC" };
char c='a';
for (int i = 'A'; i <= 'Z'; i++)
{
c = (char)i;

cospt(c.ToString());
}
return arr;
}
static void Main()
{
Class1 a = new Class1();
ArrayList arr = a.getArray();

int i = arr.Count;
}

}
liherun 2009-12-16
  • 打赏
  • 举报
回复
效率不高
 private void button2_Click(object sender, EventArgs e)
{
string[] str1 = new string[] { "ab", "bc", "cd", "de", "ef", "fg", "gh", "hi", "il" };
Get(str1);
}
//总方法
private ArrayList Get(string[] str)
{
ArrayList al = new ArrayList();
ArrayList result = new ArrayList();
char[] c;
int xiabiao = 0;
int xiabiao1 = 0;
ArrayList shuzu;
for (int i = 0; i < str.Length; i++)
{
if (al.Count == 0)
{
al.Add(str[i]);
continue;
}
c = str[i].ToCharArray();
shuzu = new ArrayList();
for (int j = 0; j < al.Count; j++)
{
xiabiao = al[j].ToString().IndexOf(c[1]);
xiabiao1 = al[j].ToString().IndexOf(c[0]);
if (xiabiao == -1)
{
if (xiabiao1 == -1)
{
shuzu.Add(str[i]);
}
else if (xiabiao1 == al[j].ToString().Length - 1)
{
al[j] = al[j].ToString() + c[1];
}
else
{
shuzu[j] = al[j].ToString().Substring(0, xiabiao1 + 1) + c[1];
}
}
else if (xiabiao == 0)
{
if (al[j].ToString().IndexOf(c[0]) > -1)
{
MessageBox.Show("你输入的规则有冲突");
return null;
}
al[j] = c[0] + al[j].ToString();
}
else
{
if (xiabiao1 == -1)
{
shuzu.Add(c[0] + al[j].ToString().Substring(xiabiao, al[j].ToString().Length - xiabiao));
}
else if (xiabiao1 > xiabiao)
{
MessageBox.Show("你输入的规则有冲突");
return null;
}
}
}
shuzu = ArrClear(shuzu);
foreach (string s in shuzu)
{
al.Add(s);
}
al = ArrClear(al);//取到所有规则
}
al = ArrClear(al);
foreach (string s in al)
{
foreach (string s1 in Getall(s))
{
result.Add(s1);
}
}
result = ArrClearXT(result);
return result;
}
//清除ArrayList中的重复和被包含的选项
private ArrayList ArrClear(ArrayList al)
{
ArrayList xiabiao = new ArrayList();
for (int i = 0; i < al.Count; i++)
{
for (int j = i + 1; j < al.Count; j++)
{
if (al[i].ToString().IndexOf(al[j].ToString())>-1)
{
xiabiao.Add(j);
}
if (al[j].ToString().IndexOf(al[i].ToString()) > -1)
{
xiabiao.Add(i);
}
}
}
xiabiao = ArrClearXT(xiabiao);
for (int i = 0; i < xiabiao.Count; i++)
{
al.RemoveAt(Convert.ToInt32(xiabiao[i]));
}
return al;
}
//清楚ArrayList重复的选项
private ArrayList ArrClearXT(ArrayList al)
{
for (int i = 0; i < al.Count; i++)
{
for (int j = i + 1; j < al.Count; j++)
{
if (al[i].ToString().Equals(al[j].ToString()))
{
al.RemoveAt(j);
}
}
}
return al;
}
//获得该规则下的所有可能 借鉴别人的方法
private List<string> Getall(string s)
{
List<string> ss = new List<string>();
ss.Add(s);
int t = s.Length;

List<string> tempss = new List<string>();
List<string> tempss2 = new List<string>();
tempss2.AddRange(ss);

while (t > 2)
{
tempss.Clear();
tempss.AddRange(tempss2);
tempss2.Clear();
foreach (string subs in tempss)
{
for (int i = 0; i < subs.Length; i++)
{
string ts = subs.Remove(i, 1);
if (!tempss2.Contains(ts))
tempss2.Add(subs.Remove(i, 1));
}
}
t--;
ss.AddRange(tempss2);
}
return ss;
}
zifeng759 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lwp1493 的回复:]
C# codestring[] str= {"AB","FA","GF","MF","LM","QM","PF","CD","DE","FAB","FB","FAC","FC"};foreach (string sin str)
{char[] ch= s.ToCharArray();bool flag=true;for (int i=0; i< ch.Length-1; ?-
[/Quote]

sorry,要的不是这个,如果真的这么个简单东西,我就不会来这里发帖子找人,讨论了,

很失败,我的表达能力!
zifeng759 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jidianxueyuan 的回复:]
看看每组两个字母的ASCII是不是差一就知道
[/Quote]

并非对字符排序,
字符只是一个抽象出来的代码而已,我用它代表的某种已知条件,和字符的ASCII 没任何关系。
先后顺序我已经给出来了,并不需要重新排序,

需要的是所有的符合已经给出来的先后顺序条件的集合,
您没看清楚要求
liherun 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lwp1493 的回复:]
C# codestring[] str= {"AB","FA","GF","MF","LM","QM","PF","CD","DE","FAB","FB","FAC","FC"};foreach (string sin str)
{char[] ch= s.ToCharArray();bool flag=true;for (int i=0; i< ch.Length-1; ?-
[/Quote]
没这么简单,明天上午去看看能不能写出代码
jidianxueyuan 2009-12-15
  • 打赏
  • 举报
回复
看看每组两个字母的ASCII是不是差一就知道
「已注销」 2009-12-15
  • 打赏
  • 举报
回复

string[] str = {"AB","FA", "GF", "MF", "LM", "QM", "PF", "CD", "DE", "FAB","FB","FAC","FC"};

foreach (string s in str)
{
char[] ch = s.ToCharArray();
bool flag = true;
for (int i = 0; i < ch.Length-1; i++)
{
if ((int)ch[i] > (int)ch[i + 1])
{
flag = false;
break;
}
}
if (flag)
{
Response.Write(s + "<br/>");
}
zifeng759 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liherun 的回复:]
A->B,
B->C,
A->C,
A->B->C,
D->E
这5条你都要得到?
[/Quote]

是的,想要这么一个类似的结果,
什么形式的都行,
提供个思路也好呀
liherun 2009-12-15
  • 打赏
  • 举报
回复
A->B,
B->C,
A->C,
A->B->C,
D->E
这5条你都要得到?
liherun 2009-12-15
  • 打赏
  • 举报
回复
明白了
zifeng759 2009-12-15
  • 打赏
  • 举报
回复
A B,
B C,
D E,

以上3组数据,
已知条件:
A 在 B前面,
B 在 C前面,
D 在 E前面。

根据这些条件延续出更多的前后关系出来,由于数据少可以用人脑判断,结果如下:
A->B,
B->C,
A->C,
A->B->C,
D->E
liherun 2009-12-15
  • 打赏
  • 举报
回复
没看太懂
楼主举个例子吧
排序前和排序后
zifeng759 2009-12-15
  • 打赏
  • 举报
回复
给个好的思路就行
wjy217213 2009-12-15
  • 打赏
  • 举报
回复
头晕,友情帮顶一下!
zifeng759 2009-12-15
  • 打赏
  • 举报
回复
分数少,没人有兴趣么
zifeng759 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zifeng759 的回复:]
抱歉没描述明白。
初始数据很简单,就是很多组带有前后关系的字符:
A B, (A排在B前面)
B C, (B排在C前面)
D E, (D排在E前面)

列出所有符合这个前后关系的字符串,用人脑判断可以得到以下结果:

AB,AC,ABC,DE 

用程序写,俺头大了,没想出好招来


[/Quote]

结果还是漏了个BC
应该是:
AB,AC,BC, ABC,DE
zifeng759 2009-12-15
  • 打赏
  • 举报
回复
抱歉没描述明白。
初始数据很简单,就是很多组带有前后关系的字符:
A B, (A排在B前面)
B C, (B排在C前面)
D E, (D排在E前面)

列出所有符合这个前后关系的字符串,用人脑判断可以得到以下结果:

AB,AC,ABC,DE

用程序写,俺头大了,没想出好招来

别递烟哥不会 2009-12-15
  • 打赏
  • 举报
回复
没看懂
加载更多回复(1)

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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