UVA 509 RAID!

思路来自:https://blog.csdn.net/wcr1996/article/details/43834545

先解释一下题意:

①输入:先输入d(disk的数量)  s(每块数据块有s个bit) b(每块disk上的数据块和校验块的数目),再输入d行数据。

②奇偶校验:E偶校验 :1的个数为偶:0              
     ·          奇:1
      O奇校验: 1个数为偶:0
                1的个数为奇:1

③disk表:

此图就是校验位和数据存放的位置,但是输入是每条每条的disk(表中竖着的)。

思路如下:

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 #include "string.h"
 4 int d,s,b,n;
 5 char disk[7][6500];
 6 int op;
 7 int read()//读入函数
 8 {
 9     scanf("%d%d%d\n",&d,&s,&b);
10     if(d==0)
11         return 0;
12     memset(disk,0,sizeof(disk));
13     char ch=getchar();
14     if(ch=='O')
15         op=1;
16     else
17         op=-1;
18     n=s*b;
19     for(int i=0;i<d;i++)
20         scanf("%s",disk[i]);
21     return 1;
22 }
23 int solve()
24 {
25     for(int i=0;i<n;i++)//n=s*b,为一个disk中的所有数据
26     {
27         int k=-1;
28         int broke=-1;
29         for(int j=0;j<d;j++)
30         {
31             char c=disk[j][i];
32             if(c=='1')
33                 k=-k;
34             if(c=='x')//记下位置
35             {
36                 if(broke!=-1)
37                     return 0;
38                 else
39                     broke=j;
40             }
41         }
42         if(broke==-1&&k!=op) return 0;//校验不合法
43         if(broke!=-1)
44             disk[broke][i]=k==op?'0':'1';//修复
45         //偶校验:op=-1,k==-1(偶数个1)补0;k=1(偶数个),补1。
46         //奇校验:op=1,k==1(奇数个1) 补0;k=-1(偶数个),补1.
47     }
48     return 1;
49 }
50 void print(int v)
51 {
52     if(v==0)
53     {
54         printf("invalid.\n");
55         return;
56     }
57     printf("valid, contents are: ");
58     int num=0,cnt=0;
59     for(int i=0;i<b;i++)
60     {
61         int pos=i*s;
62         for(int j=0;j<d;j++)
63         {
64             if(i%d==j)
65                 continue;
66             for(int k=0;k<s;k++)
67             {
68                 num<<=1;
69                 num+=disk[j][pos+k]=='1';
70                 cnt++;
71                 if((cnt%=4)==0)
72                     printf("%X",num),num=0;
73             }
74         }
75     }
76     if(cnt)
77         printf("%X",num<<(4-cnt));//补0
78     printf("\n");
79     return;
80 }
81 int main()
82 {
83     int t=0;
84     while(read()!=0)
85     {
86         printf("Disk set %d is ",++t);
87         print(solve());
88     }
89     return 0;
90 }

 

posted @ 2019-01-30 14:19  付玬熙  阅读(326)  评论(0编辑  收藏  举报