坐标X或Y(也可把坐标X、Y看作数组)根据给定的一堆坐标(随机),进行分组的算法。 
坐标数据: 
坐标:X=163,Y=83 
坐标:X=164,Y=83 
坐标:X=197,Y=83 
坐标:X=198,Y=83 
坐标:X=163,Y=84 
坐标:X=164,Y=84 
坐标:X=197,Y=84 
坐标:X=198,Y=84 
坐标:X=163,Y=85 
坐标:X=164,Y=85 
坐标:X=199,Y=85 
坐标:X=199,Y=85 
…… 要把以上坐标分组成如下: 
Point[] Group1 = {{163,83},{164,83},{163,84},{164,84},{163,85},{164,85}} 
Point[] Group2 = {{197,83},{198,83},{197,84},{198,84},{197,85},{198,85}} 
…… 分组规则:只要X或Y其中一个能从数据中找到连续的就分为一组。如下图每个几何图形分为一组。

解决方案 »

  1.   

    我的观点也跟2楼的类似。
    //迭代四个方向
    map[x][y]
    if(map[i][j]==1)
    {
      map[i][j]=0;
      check(map[i+1][j+0]);//检查右边是否使用,并看看是否含有数据,有的话需要归类到group中
      check(map[i-1][j+0]);//检查左边是否使用,并看看是否含有数据
      check(map[i+0][j+1]);//检查下边是否使用,并看看是否含有数据
      check(map[i+0][j-1]);//检查上边是否使用,并看看是否含有数据
    }
    欢迎继续探讨!!
      

  2.   

    以下给出一些数据,把它分组出来(我分出5组,不知道正确不)。
    数据:
    由于直接把数据发上来怕影响大家浏览版面,所以提供数据的txt文本下载链接。20080405185859.txt
      

  3.   

    看看效果先,我已经绘制出来:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }    private void Form1_Paint(object sender, PaintEventArgs e)
        {
            int gridSize = 20;
            for (int i = 0; i * gridSize < ClientSize.Width; i++)
            {
                e.Graphics.DrawString(i.ToString("00"), Font, Brushes.Black,
                    i * gridSize - 5, 0);
                e.Graphics.DrawLine(Pens.Gray, i * gridSize, gridSize,
                    i * gridSize, ClientSize.Height);
            }
            for (int i = 0; i * gridSize < ClientSize.Height; i++)
            {
                e.Graphics.DrawString(i.ToString("00"), Font, Brushes.Black, 0,
                    i * gridSize - 5);
                e.Graphics.DrawLine(Pens.Gray, gridSize, i * gridSize,
                    ClientSize.Width, i * gridSize);
            }        for (int i = 0; i < points.Length; i++)
                e.Graphics.DrawEllipse(Pens.Red,
                    (points[i].X + 1) * gridSize - 3, (points[i].Y + 1) * gridSize - 3,
                    6, 6);        for (int i = 0; i < groups.Count; i++)
            {
                int minX = int.MaxValue, minY = int.MaxValue, 
                    maxX = int.MinValue, maxY = int.MinValue;
                for (int j = 0; j < groups[i].Count; j++)
                {
                    Point p = groups[i][j];
                    minX = p.X < minX ? p.X : minX;
                    minY = p.Y < minY ? p.Y : minY;
                    maxX = p.X > maxX ? p.X : maxX;
                    maxY = p.Y > maxY ? p.Y : maxY;
                }
                Rectangle r = Rectangle.FromLTRB(
                    (minX + 1) * gridSize - 5, (minY + 1) * gridSize - 5,
                    (maxX + 1) * gridSize + 5, (maxY + 1) * gridSize + 5);
                e.Graphics.DrawRectangle(Pens.Blue, r);
                e.Graphics.DrawString(i.ToString(), Font, Brushes.Black, r);
            }
        }    private const int pointCount = 100;
        private Point[] points = new Point[pointCount];
        private bool[] scans; // 是否计算过
        private List<List<Point>> groups = new List<List<Point>>();    private void search(int index, List<Point> group)
        {
            if (scans[index]) return;
            scans[index] = true; // 标记已被扫描
            Point point = points[index];
            group.Add(point);
            for (int i = 0; i < points.Length; i++)
            {
                if (scans[i]) continue;
                if ((point.X == points[i].X && Math.Abs(point.Y - points[i].Y) == 1) ||
                    (point.Y == points[i].Y && Math.Abs(point.X - points[i].X) == 1))
                {
                    search(i, group);
                }
            }
        }    private void Calc()
        {
            scans = new bool[pointCount];
            groups.Clear();
            for (int i = 0; i < points.Length; i++)
            {
                if (scans[i]) continue; //计算过
                List<Point> group = new List<Point>();
                groups.Add(group);
                search(i, group);
            }
            Console.WriteLine(groups.Count);
        }    private void button1_Click(object sender, EventArgs e)
        {
            Random random = new Random();
            for (int i = 0; i < points.Length; i++)
            {
                points[i].X = random.Next(20);
                points[i].Y = random.Next(20);
            }
            Calc();
            Invalidate();
        }
    }