首页 > 其他 > 详细

UVa 509 RAID

时间:2019-02-02 13:39:46      阅读:190      评论:0      收藏:0      [点我收藏+]

这道题理解起来有点难,有点难写,但是没有什么思维难点,可以看看别人博客上的翻译,这里我就懒的说了,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("\n");
}

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.\n", ++cnt); continue; }
        change_Printf();         
    }
    return 0; 
}

 

UVa 509 RAID

原文:https://www.cnblogs.com/yifeiWa/p/10348260.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!