poj 1033

http://poj.org/problem?id=1033

题意:对一个磁盘进行整理,所谓的整理就是把同一个文件的一些数据,按照次序依次的存放,问整理的时候,磁盘的替换的操作是哪一些

思路:首先如果输入的时候就像定义好,每个文件应该存放的位置,然后看看它本身的位置和存放的位置是否一致,一致则不需要进行操作,不一致在进行操作

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 
 5 int m,n;
 6 bool mark[10005];   //这个是用判断有没有环。
 7 int num[10005]; //0代表为空,-1代表匹配好
 8 int flag;
 9 
10 void dfs(int x)
11 {
12     if(!num[num[x]])   //这个则说明,num[x]可以和x进行替换
13     {
14         printf("%d %d
",x,num[x]);
15         num[num[x]] = -1;
16         num[x] = 0;
17         return;
18     }
19     if(mark[num[num[x]]])   //判断是否成环,如果成了环,则把最开始的那个与最后的一个进行交换 ,空出一个位置。
20     {
21         for(int i = m;i>0;i--)
22             if(!num[i])
23             {
24                 printf("%d %d
",x,i);
25                 num[i] = num[x];
26                 num[x] = 0;
27                 return;
28             }
29     }
30     dfs(num[x]);
31     printf("%d %d
",x,num[x]);
32     num[num[x]] = -1;
33     num[x] = 0;
34 }
35 
36 
37 int main()
38 {
39     while(~scanf("%d%d",&m,&n))
40     {
41         int k,cnt = 1,tmp;
42         flag = 0;
43         memset(num,0,sizeof(num));
44         for(int i = 0;i<n;i++)
45         {
46             scanf("%d",&k);
47             while(k--)
48             {
49                 scanf("%d",&tmp);
50                 num[tmp]=cnt++;
51                 if(tmp ==cnt-1)  //不用进行交换
52                     num[tmp] = -1;
53             }
54         }
55         for(int i = 1;i<=m;i++)
56         {
57             if(num[i]&&num[i]!=-1)
58             {
59                 memset(mark,false,sizeof(mark));
60                 flag = 1;
61                 mark[i] = true;
62                 dfs(i);
63             }
64         }
65         if(!flag)
66             printf("No optimization needed
");
67     }
68     return 0;
69 }
原文地址:https://www.cnblogs.com/Tree-dream/p/6699164.html