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的倍数!
在借鉴了学长们的博客后,了解了题目大意:
输入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; }
相关文章推荐
- hdu 1532 Drainage Ditches(最大流之Ford-Fulkerson算法)
- Adobe AIR 不能卸载的解决方法
- 怎么区分link和domain
- Daily Scrum 12.13
- pair模板类型
- Daily Scrumming* 2015.12.13(Day 5)
- UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)
- Determining IP information for eth1... failed; no link present. Check cable? 解决办法
- Determining IP information for eth1... failed; no link present. Check cable? 解决办法
- MINI2440移植xenomai记录
- 机器学习: 朴素贝叶斯(Naive Bayes)
- LeetCode OJ——Submission Details
- Chain of Responsibility(职责链设计模式)
- 【转载】关于RAID 1+0和RAID 0+1的比较
- 从Container内存监控限制到CPU使用率限制方案
- linker command failed with exit code 1 (use -v to see invocation)
- 缩略图Thumbnails
- AIDL
- 静态局部变量 http://baike.baidu.com/link?url=h5FJNxRXfawWPNdJEzqWHpKN1HMk6u8wXLYgg8VYCqgd8MbypeKVeaOgZB0B-
- U盘安装Ubuntu——关于UltraISO打开Ubuntu只有EFI文件夹的解决方法