poj1033——Defragment

题目大意:磁盘有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(
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值