关于二维数组排座的问题,有点难

luli327 2010-08-03 11:20:41
winform程序,先在form上画坐标

Pen p1 = new Pen(Color.Yellow);
Pen p2 = new Pen(Color.Yellow);
//p1.Width = 1;
//p1.DashCap = DashCap.Triangle;
Graphics g = e.Graphics;
SolidBrush ff = new SolidBrush(Color.Yellow);
// g.FillRectangle(ff, 100, 150, 700, 350);
g.DrawRectangle(p1, 0, 0, 600, 600);

for (int i = 0; i <= 600;)
{
g.DrawLine(p2, new Point(i, 0), new Point(i, 600));
g.DrawLine(p2, new Point(0, i), new Point(600, i));
i = i + 20;
}


然后鼠标点击坐标内的格子,动态生成一个按扭

void Form1_MouseClick(object sender, MouseEventArgs e)
{
AddButton(e.X, e.Y);
}
private void AddButton(int x, int y)
{

Button b = new Button();
b.Width = 20;
b.Height = 20;
b.Location = new System.Drawing.Point((x / 20) * 20, ((y / 20)) * 20);
b.UseVisualStyleBackColor = true;
b.Click += new EventHandler(b_Click);
this.Controls.Add(b);

}

保存排座坐标

Point p;
string txt = string.Empty;
foreach (Control ctrl in this.Controls)
{
if (ctrl.GetType() == typeof(Button))
{
if (((Button)ctrl).Name != "save" && ((Button)ctrl).Name != "read" && ((Button)ctrl).Name != "sort")
{
p = ((Button)ctrl).Location;
txt += p.X / 20 + "|" + p.Y / 20 + "\r\n";
}
}
}
WriteFile(txt);


问题是,如何排座位号,比如,同一行的从左到右或者从右到左按1,2,3,4,5,6排
注:坐标上的行都是未知的
我思考了下 貌似要找到2位数组中相同的行(行未知),再按冒泡排序,但是,我不知道怎么样在2位数组中找到相同的行,这个算法怎么写,高手指点下
...全文
200 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
luli327 2010-08-03
  • 打赏
  • 举报
回复
其实就是二维数组拆分,按行拆分,再求出每个拆分组的最大值和最小值
a451274642 2010-08-03
  • 打赏
  • 举报
回复
我可以不写这么多代码,把你想要得到的算法说清楚点。我没看明白
luli327 2010-08-03
  • 打赏
  • 举报
回复
顶上去
luli327 2010-08-03
  • 打赏
  • 举报
回复
或者我简单点说,把一个二维数组按列分组,行和列都是未知的,再每个组排序
luli327 2010-08-03
  • 打赏
  • 举报
回复
就是点一个格子 加按扭 然后每行排座,最后把整个保存
luli327 2010-08-03
  • 打赏
  • 举报
回复
我要在坐标格子里动态添加按扭,排座的时候把再动态显示数字
cactus123456 2010-08-03
  • 打赏
  • 举报
回复
将 i = i + 20;
放到 if (hdmin.Contains(i / 20))
的后面就可以显示第一排了
cactus123456 2010-08-03
  • 打赏
  • 举报
回复
将我的代码替换你的,看看是不是这个意思,目前不能处理第一排
private HybridDictionary hdmin = new HybridDictionary();
private HybridDictionary hdmax = new HybridDictionary();

private void Form2_Paint(object sender, PaintEventArgs e)
{
Pen p1 = new Pen(Color.Yellow);
Pen p2 = new Pen(Color.Yellow);
//p1.Width = 1;
//p1.DashCap = DashCap.Triangle;
Graphics g = e.Graphics;
SolidBrush ff = new SolidBrush(Color.Yellow);
SolidBrush ff2 = new SolidBrush(Color.Red);
// g.FillRectangle(ff, 100, 150, 700, 350);
g.DrawRectangle(p1, 0, 0, 600, 600);

for (int i = 0; i <= 600; )
{
g.DrawLine(p2, new Point(i, 0), new Point(i, 600));
g.DrawLine(p2, new Point(0, i), new Point(600, i));
i = i + 20;
if (hdmin.Contains(i / 20))
{
int x=Convert.ToInt32( hdmin[i / 20].ToString());
int sort = Convert.ToInt32(hdmax[i / 20].ToString());
int k = 0;
for (int j = x; j < sort; j++)
{
k++;
g.DrawString((k + 1).ToString(), Form2.DefaultFont, ff2, (j + 1) * 20, i);
}
}
}

}




private void button1_Click(object sender, EventArgs e)
{
Point p;
string txt = string.Empty;
foreach (Control ctrl in this.Controls)
{
if (ctrl.GetType() == typeof(Button))
{
if (((Button)ctrl).Name != "save" && ((Button)ctrl).Name != "read" && ((Button)ctrl).Name != "sort")
{
p = ((Button)ctrl).Location;
txt += p.X / 20 + "|" + p.Y / 20 + "\r\n";
if (hdmin.Contains(p.Y / 20))
{
if (Convert.ToInt32(hdmin[p.Y / 20]) > (p.X / 20))
hdmin[p.Y / 20] = p.X / 20;
}
else
{
hdmin.Add(p.Y / 20, p.X / 20);
}
if (hdmax.Contains(p.Y / 20))
{
if (Convert.ToInt32(hdmax[p.Y / 20]) < (p.X / 20))
hdmax[p.Y / 20] = p.X / 20;
}
else
{
hdmax.Add(p.Y / 20, p.X / 20);
}
}
}
}
textBox1.Text = txt;
this.Refresh();
}

luli327 2010-08-03
  • 打赏
  • 举报
回复
再顶上去
luli327 2010-08-03
  • 打赏
  • 举报
回复
是任意的
cactus123456 2010-08-03
  • 打赏
  • 举报
回复
每行只要选定2个座位,且只能选定2个座位作为标号的分界?还是每行可以选定偶数的座位,标号它们之间的座位
luli327 2010-08-03
  • 打赏
  • 举报
回复
不懂装懂 有意思么 呵呵 继续讨论
wheeler 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 luli327 的回复:]

我上面的代码不知道你有没看懂
[/Quote]

OK! 你高手~ 我没看懂!

请等待高人来吧~ 谢谢! 对比起了!!!
luli327 2010-08-03
  • 打赏
  • 举报
回复
等看得懂的高手来作答
wheeler 2010-08-03
  • 打赏
  • 举报
回复
号码 = 排号 * 每行总座位数 + 座号

???
luli327 2010-08-03
  • 打赏
  • 举报
回复
我上面的代码不知道你有没看懂
luli327 2010-08-03
  • 打赏
  • 举报
回复
没这么简单,座位都是动态的,行和列全是动态的,我这个功能是设定一个会议厅的座位,再给每个座位编号
luli327 2010-08-03
  • 打赏
  • 举报
回复
要有号码,你的常识里都是没号码的
wheeler 2010-08-03
  • 打赏
  • 举报
回复

class 座位
{
}

class cls排座
{
List<List<座位>> 所有座位 = new List<List<座位>>();

//所有座位[0] 第1排所有座位
//所有座位[0][0] 第1排第1座
//所有座位[6][8] 第7排第9座
}


??就这样?
luli327 2010-08-03
  • 打赏
  • 举报
回复
排座次,每排1,2,3,4,5,6 明白?
加载更多回复(3)

110,566

社区成员

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

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

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