传送门:UVA-509
对所有磁盘对应位的异或和进行校验,如果有两位损坏,则数据不可恢复,因为复原状况不唯一
AC代码:
#include<iostream>
using namespace std;
int main()
{
int d,s,b,op,num=1;//num代表数据集的序列,op代表校验码
char vir;//代表奇偶校验
string pq[10];//按磁盘存储数据
while(cin>>d){
if(!d) break;
cin>>s>>b>>vir;
if(vir=='E') op=0;
else op=1;
for(int i=0;i<d;++i) cin>>pq[i];
int flag=1;//为0则invalid
for(int i=0;i<s*b;++i){
int cnt=0,tmp[2]={0,1},r;//r代表损坏位所在磁盘位置
for(int j=0;j<d;++j) if(pq[j][i]=='x') r=j,++cnt;
if(cnt>1){flag=0;break;}//如果有两个及以上位损坏则数据不唯一,故不可用
if(!cnt){//没有损坏则直接校验
int fg=pq[0][i]-'0';
for(int j=1;j<d;++j) fg=fg^(pq[j][i]-'0