困扰几天的算法题,求专家回答?(一百分题),不够再加。 一组面板:1,2,3,4如果在窗体已加载面板1,接着只可以加载面板2,3,4;如果在窗体已加载面板1,3,接着必须先加载面板2,然后加载面板4;如果在窗体已加载面板1,2,4,接着只可以加载面板3; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用一个数组 A 存放四个面板的加载状态,A[0] ,面板数A[1] ,1面板A[2] ,2面板A[3] ,3面板A[4] ,4面板当别的地方加载面板时,设置相应的标记for(int i=1;i<A.Length;i++){ if( A[i] == 0) 未加载 { //加载面板 A[i] = 0; }}这样的话,别的面板别加载时,面板没有被加载的,一定会被加载,而且序号小的一定先加载, int a=0,b=0,c=0,d=0,sum=0;if(面板1已加载) a=1;if(面板2已加载) b=2;if(面板3已加载) c=4;if(面板4已加载) d=8;sum=a+b+c+d;switch(sum){ case 1:加载2,3,4;break; case 5:加载2再加载4;break; case 11:加载3;break; default: break;} switch一下不就可以了?这也叫算法? containerif(container.contain(面板1)&&!container.contain(要加的面板)){if(container.count==1){container.add(要加的面板);}else if(container.count==2&&container[1]==3){container.add(面板2);}else{container.add(要加的面板);}} class TPanel { private string _id; public TPanel(string id) { _id = id; } private bool _isLoaded; public bool IsLoaded { get { return _isLoaded; } set { _isLoaded = value; } } } private void LoadAllPanel() { TPanel [] panels = new TPanel[5](); for (int i = 0; i < panels.Length; i++) { panels[i] = new TPanel("panel_" + i); } //...do something if(panels[1].IsLoaded && panels[2].IsLoaded && panels[4].IsLoaded){ LoadPanel(panels); } else if (panels[1].IsLoaded && panels[3].IsLoaded) { LoadPanel(panels); } else if (panels[1].IsLoaded) { LoadPanel(panels); } } private void LoadPanel(TPanel[] p) { for (int i = 1; i < p.Length; i++) { if (!p[i].IsLoaded) { LoadPanel(p[i]); } } } private void LoadPanel(TPanel p) { //...do something... p.IsLoaded = true; }实际上,写完后就会发现,下面这一段执行的效果等同于,直接调用 LoadPanel(panels);。对于剩下未加载的面板,按下标顺序加载。if(panels[1].IsLoaded && panels[2].IsLoaded && panels[4].IsLoaded){ LoadPanel(panels); } else if (panels[1].IsLoaded && panels[3].IsLoaded) { LoadPanel(panels); } else if (panels[1].IsLoaded) { LoadPanel(panels); } 没明白是什么意思你的意思是你有无穷个面板?要不不会存在什么正无穷大的问题。。1,2,3,4任意的组合都可以通过abcd的和来表示。。 最小的面板循环到最大的面板,找出是null的面板,实例化。 面板应该多不到哪吧就用switch好了 动态加载条件。使用xml文件存储你的那些的条件。比如.........<condition><if> <panel id=1></if><then> <panel id=2> <panel id=3> <panel id=4></then></condition>.......创建实体类class panel{ string id; ....}class condition{ ArrayList<panel> if; ArrayList<panel> then;}将xml里的condition标签全部加载到实体类中剩下的,把你的预想的条件,和condition里的if里的内容进行比较,一致,那就运行then所指代的所有面板;不一致,就和下一个condition进行比较。这里无穷个条件是不可能的,ArrayList,或者说C#数组也有限制的,最多只能做到随机条件的和结果的一个搭配算法。 个人认为比较简单,一下是代码,希望有用 class PannelAdd { public void DoAdd() { List<int> added = new List<int>(); List<int> source = new List<int>(); List<int> neededToAdd = new List<int>(); for (int i = 1; i < 11; i++) { if (i % 3 == 0) { //模拟获取已经加载的pannel到AddedList added.Add(i); } //模拟有哪些Pannel source.Add(i); } //在所有pannel中排除已经加载的,得到需要加载的 foreach (int value in source) { if (added.Contains(value) == false) { neededToAdd.Add(value); } } //按你的要求来看,所有需要加载的是按从小到大加载,所以这里排序 neededToAdd.Sort(); //模拟你的加载过程 StringBuilder target = new StringBuilder(); foreach (int value in neededToAdd) { //用于模拟向窗体加载面板 target.AppendLine(value.ToString()); } //模拟加载结果 Console.WriteLine(target.ToString()); } } [100分]求类操作winfrom界面控件的简单实例 如何快速判断FTP连接上,并且能判断密码是否正确 简单的循环 GDI+画 运动图像,如何去掉前面的图像(窗体有背景图片) 在WINFORM中能不能触发一个页面的SUBMIT,谢谢 高分求助查询ACCESS数据库的问题 要用C#做一个类似电子地图查找的软件.请问需要注意些什么,有做的吗?帮忙.毕业设计 关于IP换代理的问题 DLl存在,却无法加载,怪哉。。。Why??? windows应用程序中如何制作真正的进度条啊?高手麻烦给个例子 关于TCPClient的问题? 关于委托使用得问题
用一个数组 A 存放四个面板的加载状态,
A[0] ,面板数
A[1] ,1面板
A[2] ,2面板
A[3] ,3面板
A[4] ,4面板当别的地方加载面板时,设置相应的标记
for(int i=1;i<A.Length;i++)
{
if( A[i] == 0) 未加载
{
//加载面板
A[i] = 0;
}
}这样的话,别的面板别加载时,面板没有被加载的,一定会被加载,而且序号小的一定先加载,
if(面板1已加载) a=1;
if(面板2已加载) b=2;
if(面板3已加载) c=4;
if(面板4已加载) d=8;
sum=a+b+c+d;
switch(sum)
{
case 1:加载2,3,4;break;
case 5:加载2再加载4;break;
case 11:加载3;break;
default: break;
}
这也叫算法?
if(container.contain(面板1)&&!container.contain(要加的面板))
{
if(container.count==1)
{
container.add(要加的面板);
}
else if(container.count==2&&container[1]==3)
{
container.add(面板2);
}
else
{
container.add(要加的面板);
}
}
{
private string _id;
public TPanel(string id)
{
_id = id;
} private bool _isLoaded;
public bool IsLoaded
{
get { return _isLoaded; }
set { _isLoaded = value; }
}
} private void LoadAllPanel()
{
TPanel [] panels = new TPanel[5]();
for (int i = 0; i < panels.Length; i++)
{
panels[i] = new TPanel("panel_" + i);
}
//...do something if(panels[1].IsLoaded && panels[2].IsLoaded && panels[4].IsLoaded){
LoadPanel(panels);
}
else if (panels[1].IsLoaded && panels[3].IsLoaded)
{
LoadPanel(panels);
}
else if (panels[1].IsLoaded)
{
LoadPanel(panels);
}
}
private void LoadPanel(TPanel[] p)
{
for (int i = 1; i < p.Length; i++)
{
if (!p[i].IsLoaded)
{
LoadPanel(p[i]);
}
}
}
private void LoadPanel(TPanel p)
{
//...do something...
p.IsLoaded = true;
}
实际上,写完后就会发现,下面这一段执行的效果等同于,直接调用 LoadPanel(panels);。
对于剩下未加载的面板,按下标顺序加载。if(panels[1].IsLoaded && panels[2].IsLoaded && panels[4].IsLoaded){
LoadPanel(panels);
}
else if (panels[1].IsLoaded && panels[3].IsLoaded)
{
LoadPanel(panels);
}
else if (panels[1].IsLoaded)
{
LoadPanel(panels);
}
没明白是什么意思你的意思是你有无穷个面板?
要不不会存在什么正无穷大的问题。。
1,2,3,4任意的组合都可以通过abcd的和来表示。。
就用switch好了
使用xml文件存储你的那些的条件。
比如
.........
<condition>
<if>
<panel id=1>
</if>
<then>
<panel id=2>
<panel id=3>
<panel id=4>
</then>
</condition>
.......创建实体类
class panel
{
string id;
....
}
class condition
{
ArrayList<panel> if;
ArrayList<panel> then;
}将xml里的condition标签全部加载到实体类中剩下的,把你的预想的条件,和condition里的if里的内容进行比较,一致,那就运行then所指代的所有面板;不一致,就和下一个condition进行比较。这里无穷个条件是不可能的,ArrayList,或者说C#数组也有限制的,最多只能做到随机条件的和结果的一个搭配算法。
class PannelAdd
{ public void DoAdd()
{
List<int> added = new List<int>();
List<int> source = new List<int>();
List<int> neededToAdd = new List<int>(); for (int i = 1; i < 11; i++)
{
if (i % 3 == 0)
{
//模拟获取已经加载的pannel到AddedList
added.Add(i);
}
//模拟有哪些Pannel
source.Add(i);
} //在所有pannel中排除已经加载的,得到需要加载的
foreach (int value in source)
{
if (added.Contains(value) == false)
{
neededToAdd.Add(value);
}
} //按你的要求来看,所有需要加载的是按从小到大加载,所以这里排序
neededToAdd.Sort(); //模拟你的加载过程
StringBuilder target = new StringBuilder();
foreach (int value in neededToAdd)
{
//用于模拟向窗体加载面板
target.AppendLine(value.ToString());
}
//模拟加载结果
Console.WriteLine(target.ToString()); }
}