uva509 RAID

来源:互联网 发布:html商城模板源码 编辑:程序博客网 时间:2024/06/10 23:05

1.#include <bits /stdc++.h>包含了目前c++所包含的所有头文件
2. b = 1时也有校验码
3. 没有使用多少位运算。。。

// uva509.cpp#include <stdio.h>#include <string.h>#define DISKS 8#define SIZE 80#define BLOCKS 120struct dis {    int block[BLOCKS][SIZE];} disk[DISKS];int main(){    int d, s, b, kase = 0;    int state;    while (scanf("%d%d%d", &d, &s, &b) != EOF && d != 0){        kase++;        char c;        getchar();        scanf("%c", &c);        getchar();        state = (c == 'E') ? 0 : 1;  // 0 for even        // printf("d = %d s = %d b = %d state = %d\n", d, s, b, state);        for (int pd = 0; pd < d; pd++){            for (int pb = 0; pb < b; pb++){                for (int ps = 0; ps < s; ps++){                    c = getchar();                    if (c == 'x') disk[pd].block[pb][ps] = -1;  // -1 for corrupted data                    else disk[pd].block[pb][ps] = c - '0';                }            }            getchar();        }        bool valid = true;        for (int pb = 0; pb < b; pb++) {            for (int ps = 0; ps < s; ps++){                int tot = 0, recover = 0, px;                for (int pd = 0; pd < d; pd++){                    if (disk[pd].block[pb][ps] == -1) {tot++; px = pd;}                    else recover = recover ^ disk[pd].block[pb][ps];                }                if (tot == 0 && recover != state || tot > 1) {                    valid = false;                    break;                }                if (tot == 1) disk[px].block[pb][ps] = (state == 0) ? recover : 1 ^ recover;            }            if (!valid) break;        }        int i = 0, tot = 0;        if (valid) printf("Disk set %d is valid, contents are: ", kase);        else printf("Disk set %d is invalid.", kase);        if (valid)        for (int pb = 0; pb < b; pb++){            for (int pd = 0; pd < d; pd++){                if (pb % d == pd) continue;                for (int ps = 0; ps < s; ps++){                    if (i < 4) {                        tot = tot * 2 + disk[pd].block[pb][ps];                        i++;                    }                    if (i == 4) {                        printf("%X", tot);                        i = 0;                        tot = 0;                    }                }            }        }        if (i == 0) printf("\n");         else {            for (int j = 0; j < 4 - i; j++) tot *= 2;            printf("%X\n", tot);        }    }    return 0;}