向高手请教个算法

liuys00 2009-04-24 10:22:53
一块4*2的大屏幕,由8个小块屏组成,每个小块都有编号
如下图:
1 2 3 4
5 6 7 8

每个小块都有编号和坐标。如屏1的坐标是(0,0),屏3是(2,0);屏8是(3,1);

大屏幕的任意相邻的几块可以组合成一个大的新块。
写个函数,求出指定的那个新的大块的坐标和宽高。
public string Calculte(string str,int toWhere)// toWhere表示指定的那个新块是第几块
{}

比如输入是str=”G,1,2,3,4,5,6,7,8”; toWhere=0;
表示把1,2,3,4,5,6,7,8这几个小块合成一个大块,
那么这个大块的坐标就是x=0,y=0,width=4,height=2

比如输入是str=”G,1,2,5,6;G,3,4,7,8”;
表示把1,2,5,6,这几个小块合成一个大块, 3,4,7,8,这几个小块合成一个大块,
toWhere=0;那么这个大块的坐标就是x=0,y=0,width=2,height=2
toWhere=1;那么这个大块的坐标就是x=2,y=0,width=2,height=2

比如输入是str=”G,1;G,2,3,6,7;G,4;G,5;G,8”;
表示分成5个大块,分别是1, 2367,4,5,
toWhere=0;那么这个大块的坐标就是x=0,y=0,width=1,height=1
toWhere=1;那么这个大块的坐标就是x=2,y=0,width=2,height=2
toWhere=2;那么这个大块的坐标就是x=3,y=0,width=1,height=1

...全文
193 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wartim 2009-04-27
  • 打赏
  • 举报
回复
代码不贴了,既然是一样大的,那通过行列就可以得出起始坐标和长,宽了么,然后坐标运算

Point P1 = new Point(0, 0);
Point P2 = Point.Add(P1, new Size(1, 2));
MessageBox.Show(P2.ToString());
pathuang68 2009-04-27
  • 打赏
  • 举报
回复
帮顶一下
zhjql 2009-04-24
  • 打赏
  • 举报
回复
5楼正解
有N个小块,一个i*j的屏幕,第n(n>i)块的坐标为((n-1)\i, (n-1)%i)。
如果都是方块,首尾坐标相减就是了。
代码就不写了,不超过10行。
blestcc 2009-04-24
  • 打赏
  • 举报
回复
這就是排序問題啊,分別按橫坐標排序和按縱坐標排序
_see_you_again_ 2009-04-24
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
string result = Calculte("G,1,2,3,4,5,6,7,8", 0);
Console.WriteLine(result);
result = Calculte("G,1,2,5,6;G,3,4,7,8", 0);
Console.WriteLine(result);
result = Calculte("G,1,2,5,6;G,3,4,7,8", 1);
Console.WriteLine(result);
result = Calculte("G,1;G,2,3,6,7;G,4;G,5;G,8", 0);
Console.WriteLine(result);
result = Calculte("G,1;G,2,3,6,7;G,4;G,5;G,8", 1);
Console.WriteLine(result);
result = Calculte("G,1;G,2,3,6,7;G,4;G,5;G,8", 2);
Console.WriteLine(result);
result = Calculte("G,1;G,2,3,6,7;G,4;G,5;G,8", 4);
Console.WriteLine(result);
Console.Read();

}
public static string Calculte(string str, int toWhere)
{
int[,] screen = new int[,] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } };
string[] gs = str.Split(';');
if (gs.Length <= toWhere)
return "";
string[] blocks = gs[toWhere].Split(',');
int lx = 0, ly = 0,rx=0,ry=0;
GetXY(screen,out lx,out ly,int.Parse(blocks[1]));
GetXY(screen,out rx,out ry,int.Parse(blocks[blocks.Length - 1]));
return string.Format("x={0},y={1},width={2},height={3}", lx, ly, rx-lx+1, ry-ly+1);
}
public static void GetXY(int[,] screen,out int x,out int y,int n)
{
x = 1; y = 1;
bool found = false;
for (int i = 0; i < screen.GetLength(1); i++)
{
if (found == true)
break;
for (int j = 0; j < screen.GetLength(0); j++)
{
if (screen[j, i] == n)
{
x = i;
y = j;
found = true;
break;
}
}
}
}
chyyyin 2009-04-24
  • 打赏
  • 举报
回复
以上的宽实际指你的那个“高”
chyyyin 2009-04-24
  • 打赏
  • 举报
回复
呵呵,C#好久没碰了,用vb给你写个,思路是一样的!
个人感觉你的参数不足,因为你的大屏幕总格数是确定的吗,而且长*宽是固定的吗?
以下代码假设你的总格数固定为8个,长*宽=4*2

……
dim X as integer=4
dim Y as integer=2
dim rows as string()=str.split(";") '你这里的分隔符好像是“;”(分号)吧!

'for each row as string in rows
' row=row.substring(2,row.length-2) '好像你的每个块标示前面都有一个“G,”,大概就2个字符
' dim columns as integer() =row.split(",")
' '这里自己先把columns里的每一个字符转换为数字,然后进行一个排序,按从小到大的顺序重新赋给columns,简单问题,自己解决!
' '排完序后执行以下代码,
' dim i as integer=0
' while i< columns.length
' if columns(i)>4 then
' 'return '这里返回你的新块
' end if
' i+=1
' end while
'next

dim row as string=rows(towhere-1)
row=row.substring(2,row.length-2) '好像你的每个块标示前面都有一个“G,”,大概就2个字符
dim columns as integer()=row.split(",")
'这里自己先把columns里的每一个字符转换为数字,然后进行一个排序,按从小到大的顺序重新赋给columns,简单问题,自己解决!
'排完序后执行以下代码,
dim cc as integer=1
if columns(0)>4 then
'return '这里返回你的towhere块的坐标以及长*宽,坐标就等于columns(0)的坐标,长*宽=(columns.length)* 1
else
dim i as integer=0
while i< columns.length
if columns(i)>4 then
return '这里返回你的towhere块的坐标以及长*宽,坐标就等于columns(0)的坐标,长*宽=cc* 2
else
cc+=1
end if
i+=1
end while
'这里返回你的towhere块的坐标以及长*宽,坐标就等于columns(0)的坐标,长*宽=cc* 1
end if
……


呵呵,刚开始考虑复杂了,忽略了你还有个towhere,汗~楼主可以参考下,应该可以实现你的需求吧,因为每个块的边长是已知的,所以我在return的时候只是大概描述了下,楼主可以根据自己的具体需求来return
jryu2k5 2009-04-24
  • 打赏
  • 举报
回复
LZ有没有发现其实无论是哪几块组成的大块都是由其中X,Y坐标值最小的那块的坐标为大块的开始坐标,在X轴拥有最大值的小块的X坐标减去开始坐标就为大块的宽,在Y轴拥有最大值的小块的Y坐标减去开始坐标就为大块的高,那么问题就可以转化成一个求坐标最小值与两个单向坐标最大值的问题了
liuys00 2009-04-24
  • 打赏
  • 举报
回复
???在线等
xiaoyasheng 2009-04-24
  • 打赏
  • 举报
回复
towhere?
liuys00 2009-04-24
  • 打赏
  • 举报
回复
返回值的类型自定义即可,只要能给我答案。
把整个屏分成N个块后,我要得到第i个块的坐标和宽高,toWhere就是i值。
str把屏分成N个块,每个块用分号隔开。

比如输入是str=”G,1;G,2,3,6,7;G,4;G,5;G,8”;
表示分成5个大块,分别是1, 2367,4,5,8
toWhere=0;那么这个大块 就是编号1所在块, 坐标就是x=0,y=0,width=1,height=1
toWhere=1;那么这个大块就是编号2367所在块,坐标就是x=2,y=0,width=2,height=2
toWhere=2;那么这个大块就是编号4所在块, 坐标就是x=3,y=0,width=1,height=1
chyyyin 2009-04-24
  • 打赏
  • 举报
回复
你要求的是生成的所有大专的坐标跟宽高吧!
返回结果至少应该是个数组才对啊!
towhere参数详解下做什么的,举的几个例子看不出变换特征!难道你写错了?!

111,126

社区成员

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

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

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