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\n",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\n",x,i); 25 num[i] = num[x]; 26 num[x] = 0; 27 return; 28 } 29 } 30 dfs(num[x]); 31 printf("%d %d\n",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\n"); 67 } 68 return 0; 69 }