题目大意:磁盘有N个簇,有K个文件的每个簇分散在磁盘上,将第一个文件的所有簇移到磁盘1...S1簇,第二个文件的所有簇移到磁盘S1+1...S1+S2簇,问如何用最少的移动次数来实现
输入:N K(1 <= K < N <= 10000)
第i个文件所占的簇个数Si 第i个文件的第j个簇在磁盘中的编号 ... (1 <= Si < N)
输出:如果已经是最佳放置则输出No optimization needed
否则输出移动操作Pj Qj(从Pj移动到Qj上)
分析:简单搜索,首先在输入时判断文件的簇是否已经在合适的位置上(即放的顺序号与磁盘位置号相等),用num[]储存磁盘上第i号位置的状态(0为空,-1为已匹配好,其他为第i号位置所存放的文件碎片顺序号),然后依次对磁盘第x位置(未匹配成功且非空的磁盘簇)dfs搜索,即把在x位置的碎片复原
dfs过程:如果第x簇上的文件碎片可以放到num[x]簇上,则直接放(不冲突时)
如果成环(即第x簇上的碎片应放在num[x]上,num[x]上的碎片应放在x上),此时两者无法直接对调,将x移到磁盘上最后一个空簇上,空出x位置
如果不是以上两种情况,就说明num[x]被其他碎片占用,dfs(num[x])即先将num[x]上的碎片复原,然后就可以将x放到num[x]上了
代码:转载自https://www.cnblogs.com/Tree-dream/p/6699164.html
1 #include <stdio.h> 2 #include <string.h> 3 5 int m,n; 6 bool mark[10005]; //这个是用判断有没有环。 7 int num[10005]; //0代表为空,-1代表匹配好 8 int flag; 9 10 void dfs(