UVa 509 RAID

这道题理解起来有点难,有点难写,但是没有什么思维难点,可以看看别人博客上的翻译,这里我就懒的说了,233,下面是代码。

//UVa 509
//PAID
#define LOCAL
#include <stdio.h> 
#include <string.h> //use memset

const int maxn = 10, maxd = 1e3 * 7; 
const char a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
const char b[] = {'A', 'B', 'C', 'D', 'E', 'F'};


char paid[maxn][maxd], Num[maxn*maxd];
int disk, size, block, cnt;

void change_Printf()
{
    memset(Num, 0, sizeof(Num));
    printf("Disk set %d is valid, contents are: ", ++cnt);
    int N = 0, tot;
    for(int i = 0; i < size*block; i+=size) 
        for(int j = 1; j <= disk; j++) {
            if(!((i/size - (j-1)) % disk)) continue; 
            for(int k = i; k < i+size; k++) 
                Num[++N] = paid[j][k] - '0'; 
        }
    if(N % 4) N = (N / 4 + 1) * 4;
    for(int i = 0; i < N/4; i++) {
        tot = 0;
        for(int j = 4; j >= 1; j--) 
            tot += (Num[i*4+j] * (1 << (4-j))); 
        if(tot < 10) printf("%d", a[tot]);    
        else printf("%c", b[tot-10]);     
    }
    printf("
");
}

int check(char M[]) 
{
    int T = 0, x, y;
    if(M[0] == 'O') T = 1; 
    for(int i = 0; i < size*block; i++) {
        int cnt = 0;
        for(int j = 1; j <= disk; j++) 
            if(paid[j][i] == 'x') { x = j; y = i; cnt++; }
        if(cnt >= 2) return 0; 
        if(cnt == 1) { //change 'x'
            paid[x][y] = '0'; 
            int C = paid[1][i] - '0';
            for(int j = 2; j <= disk; j++)
                C = C ^ (paid[j][i] - '0'); 
            if(C != T) paid[x][y] = '1'; 
        }
        if(cnt == 0) {
            int C = paid[1][i] - '0'; 
            for(int j = 2; j <= disk; j++) 
                C = C ^ (paid[j][i] - '0'); 
            if(C != T) return 0;        
        }
    }
    return 1;
}

int main()
{
    #ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    char mod[5];
    while(scanf("%d", &disk) && disk != 0) {
        scanf("%d%d%s", &size, &block, mod);
        for(int i = 1; i <= disk; i++) scanf("%s", paid[i]);
        if(!check(mod)) { //no 
            printf("Disk set %d is invalid.
", ++cnt); continue; }
        change_Printf();         
    }
    return 0; 
}
语言c++计算机程序设计爱好者 不定期更新题目题解 望互相分享心得体会 有意留言加q
原文地址:https://www.cnblogs.com/yifeiWa/p/10348260.html