今天做了几道关于暴力遍历的问题,share之。
1.题意解释完即为:给定一系列的矩形的长和宽,要求排序,后面的矩形的长宽要都比前面的矩形的来的大,问需要排几次。
乍一看之下,没有什么很好的思路,最先想到的是,将矩形的长和宽映射到坐标上。创建一个足够大的数组a[10000][10000],假设某个矩形为3x5,则 a[0][0],a[0][1]....a[2][4]都+1.以此类推,这样遍历一遍数组,就能把矩形的重叠情况记录下来了。但是似乎到此还是没有解决问题的思路。参考,这似乎是解别的问题的思路。
最终的方案还是暴力遍历,先按长排序,然后从边长最短的矩形开始,查找后续的能够完全覆盖他的矩形,以此类推。
这个思路其实还是有点类似于基数排序的思路的。
伪代码如下:
// 对L 从小到大排序,同时调整W 和L 保持一致
selectSort(L);
// 对于L[i]相同的时候,再对W排序
int startIndex=0;
for(int i=0;i<N;i++){
selectSort(startIndex,i,W);
startIndex=i;
}
int nodeCount=0;//记录已经访问了多少矩形
int max=W[0];
while(nodeCount < N){
boolean onlyOne=true;
for(1 : N){
//从前往后找,发现宽度比之前最大的大的,则一定可以覆盖,因为已经按照L排序,并且L 相同的情况下,也按照W 排序,不会产生漏掉矩形的情况。
if(W[i] >= max){
nodeCount++;
onlyOne =false;
}
}
if( onlyOne){
delete();//删除当前的节点
nodeCount++;
}
}
2.N 个人有序,M 的空间(N>M),问给出的序列能否满足出空间的顺序。
例子:
5个人,3个空间,则问1,3,5,4,2 是否可能
首先,N个人是有序的,则3个空间先被1,2,3 个人占满,然后第1个人出去,4进来占据空间,3出去,5进来占据空间,5出去,4出去,2出去。
则出空间的顺序为:1,3,5,4,2 即给定的顺序为可能的。
这个问题,乍一看,觉得可能是和栈或是队列有关的题目,但是实际情况是,并没有限制只有从一头才能出去。再乍一看,还以为是拓扑排序相关。还没温习完图谱排序的知识。
TODO:
图中任意点对的距离和问题。--deadline 04.11