您的位置:首页 > 大数据 > 人工智能

4-7 UVA 509 RAID!

2015-12-14 01:07 459 查看
个人感觉这个题难点在于读题,和一些小细节的把握:

在借鉴了学长们的博客后,了解了题目大意:

输入d,s,b分别为:磁盘个数;一个磁盘占有的大小(就是几个数字绑在一个磁盘上);和每一个磁盘上数据的多少(也就是每一行有几个数字组合),然后再输入奇校验,还是偶校验,查阅资料,或者观察样例后可以知道,如果是奇校验,则每一列1的个数为奇数个,如果为偶校验,则每一列1的个数为偶数个(注意1的个数可以为0),然后对输入的数据还原。

整体思路:

可以开一个char类型的二维数组存储输入的数据,根据题意, 1 ≤ b ≤ 100, 1 ≤ s ≤ 64,而每一行数据个数为b * s个,所以一行数据最多是6400个,行数是d最多是6,所以开数组可以开char [ 15 ] [ 7000 ];,先写main函数(自顶向下,逐步求精),大体分为两个过程,先判断是不是合法,在根据判断函数的返回值来进行对应的输出。judge函数,就是根据刚才说的奇偶校验来讲X进行还原。还原出二进制数据后,在把去掉校验块的数据连接起来,进行输出到16进制,没必要将整个全部数据转换到16进制,可以每四个二进制进行转换到16进制,这样也是不错的!

教训:

1.认真观察样例:样例给的原始数据为自上而下,而不是自左向右!

2.注意好细节:原文最后讲到:Ifnecessary,addextra‘0’bitsattheend of the recovered data so the number of bits is always a multiple of 4.如果整个数据长度不是四的倍数,则需要补额外的0来达到4的倍数!

#include<stdio.h>
#include<string.h>
#define MAXN 7000 + 5
#define MINN 10 + 5
char str[MINN][MAXN],type[MINN];
int d,s,b;
int judge()//判断是否合法,如果有X的话,就先把X值求出来!
{
int i,j,w_j,num_x = 0,num_one = 0;
for (i = 1; i <= b * s; ++i){
num_x = num_one = 0;
for (j = 1; j <= d; ++j){
if (str[j][i] == 'x'){
num_x++;
w_j = j;
}
if (str[j][i] == '1')num_one++;
}
if (num_x >= 2)return 0;
if (num_x ){//number_x is odd!{
if (type[0] == 'E'){
if (num_one % 2 == 0)str[w_j][i] = '0';
else str[w_j][i] = '1';
}else{
if (num_one % 2 == 1)str[w_j][i] = '0';
else str[w_j][i] = '1';
}
}else{
if (type[0] == 'E'){
if (num_one % 2 == 1)return 0;
}else{
if (num_one % 2 == 0)return 0;
}
}
}
return 1;
}
void print_str()
{
int i,j,k,sum = 0,sum_cont2 = 0,h,l;
for (i = 1; i <= b; ++i){
int cont = i % d;
if (!cont)cont = d;
for (j = 1; j <= d; ++j){
if (j == cont)continue;//碰到校验块后跳过
for (k = 1 + (i - 1) * s; k <= i * s; ++k){
if (sum_cont2 < 4){
sum = sum * 2 + str[j][k] - 48;
sum_cont2++;
}else{
printf("%X",sum);
sum = sum_cont2 = 0;
sum = sum * 2 + str[j][k] - 48;
sum_cont2 = 1;
}
}
}
}
if (sum_cont2 < 4){
sum *= (1 << (4 - sum_cont2));//补0
printf("%X",sum);
}else if (sum_cont2 == 4)printf("%X",sum);
}
int main()
{
int i,j,cont = 0;
while(~scanf("%d",&d) && d){
memset(str,0,sizeof(str));
scanf("%d%d%s",&s,&b,type);
for (i = 1; i <= d; ++i)
scanf("%s",str[i] + 1);
if (!judge())printf("Disk set %d is invalid.",++cont);
else{
printf("Disk set %d is valid, contents are: ",++cont);
print_str();
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: