在处理表格合并等问题时,可以考虑采用位图算法实现二维存储对象的处理
通过Map.Set设置点值或Map.Fill填充区域。
判断各点值时通过Map.Get获取
扩展Point属性可以改成3维或更多维实现多维存储对象的处理
/// <summary>
/// 二维图形算法
/// 王洪岐 121226
/// </summary>
/// <typeparam name="T"></typeparam>
public class Map<T>
{
private Dictionary<Point, T> _map;
/// <summary>
/// 构建图
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public Map()
{
_map = new Dictionary<Point, T>();
}
/// <summary>
/// 填充图
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
public void Fill(Point a, Point b, T value)
{
for (int x = Math.Min(a.X, b.X); x <= Math.Max(a.X, b.X); x++)
{
for (int y = Math.Min(a.Y, b.Y); y <= Math.Max(a.Y, b.Y); y++)
{
_map[new Point(x, y)] = value;
}
}
}
/// <summary>
/// 设置单点值
/// </summary>
/// <param name="a"></param>
/// <param name="value"></param>
public void Set(Point p, T value)
{
_map[p] = value;
}
/// <summary>
/// 获取单点值
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public T Get(Point p)
{
return _map.ContainsKey(p) ? _map[p] : default(T);
}
/// <summary>
/// 显示点
/// </summary>
/// <returns></returns>
public string ShowPoint()
{
int intMaxX= _map.Keys.Max(p=>p.X);
int intMaxY= _map.Keys.Max(p=>p.Y);
StringBuilder sbReturn = new StringBuilder();
for (int y = 0; y <= intMaxY; y++)
{
for (int x = 0; x <= intMaxX; x++)
{
sbReturn.Append(_map.ContainsKey(new Point(x, y))?"1":"0");
}
sbReturn.Append("\n");
}
return sbReturn.ToString();
}
}
/// <summary>
/// 点坐标
/// </summary>
public struct Point
{
private int _X;
private int _Y;
/// <summary>
///
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public Point(int x, int y)
{
_X = x;
_Y = y;
}
/// <summary>
/// X
/// </summary>
public int X
{
get
{
return _X;
}
set
{
_X = value;
}
}
/// <summary>
/// Y
/// </summary>
public int Y
{
get
{
return _Y;
}
set
{
_Y = value;
}
}
}