求一个搜索算法
在一个 100 * 100 的格子区域内分布着不规则的可建筑的区域,在这个区域上可以修建 2 * 3, 3 * 2, 4 * 5 等不同长宽的矩形建筑,现在要找出一种浪费的空间最少,且能修建更多大面积建筑的方法。修建更多大面积建筑是指在浪费的空间相同的情况下优先修建 4 * 5 而不是 2 * 3.
输入: 一个 100 * 100 大小的 bool 数组, 为 true 的区域表示可以修建,为 false 的区域为不可修建。
输出:一个包含修建的建筑列表的数组, 建筑的信息包括建筑的位置,宽和高。
我自己写了个算法,效率太低了,当浪费的空间太大时非常慢,消耗的内存也太大,搜索不出来,看看各位高手有什么好的办法?
附我自己的代码:
[解决办法]
private void button2_Click(object sender, EventArgs e) { int[][] buildingSize = new int[][] { new int[] { 2, 3 }, new int[] { 3, 2 }, new int[] { 4, 5 } }; //记录浪费块数的数组 int[,] pRectangle = searchpRect(buildingSize, 100,100); } private int[,] searchpRect(int[][] buildingSize, int width,int height) { //初始化矩阵 int[,] pReturn = new int[width, height]; width++; height++; //初始化矩阵2 int[,] pRectangle = new int[width, height]; for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) pRectangle[i, j] = i * j; //生成可完美覆盖的矩形 int maxWidth = 0; int maxHeight = 0; foreach (int[] bsize in buildingSize) { pRectangle[bsize[0], bsize[1]] = 0; maxWidth = Math.Max(bsize[0], maxWidth); maxHeight = Math.Max(bsize[1], maxHeight); for (int i = bsize[0]; i < width; i++) for (int j = bsize[1]; j < height; j++) if ((pRectangle[i - bsize[0], j] == 0 && pRectangle[bsize[0], j] == 0) || (pRectangle[i, j - bsize[1]] == 0 && pRectangle[i, bsize[1]] == 0)) pRectangle[i, j] = 0; } //生成最少浪费块数 for (int i = 1; i < width; i++) for (int j = 1; j < height; j++) if (pRectangle[i, j] != 0) { pRectangle[i, j] = MinWaste(maxWidth, maxHeight, i, j, pRectangle); pReturn[i - 1, j - 1] = pRectangle[i, j]; } return pReturn; } private int MinWaste(int sWidth,int sHeight, int x, int y, int[,] Rectangle) { int startX = Math.Max(x - sWidth,1); int startY = Math.Max(y - sHeight,1); int min = x * y; for (int i = startX; i < x; i++) min = Math.Min(Rectangle[i, y] + Rectangle[x - i, y],min); for (int i = startY; i < y; i++) min = Math.Min(Rectangle[x, i] + Rectangle[x, y - i], min); return min; }