大水题,只是题目描述有点儿坑爹,需要枚举……不幸的是WA了一次才A,幸运的是只WA了一次……
#include <iostream>
#include <memory.h>
#include <cstdio>
using namespace std;
int main()
{
char ch;
int k,tmp,val[300],recVal[30],num[4][4],res[4][4];
int rec[4][4]={{2,3,1,1},{1,2,3,1},{1,1,2,3},{3,1,1,2}};
memset(val,0,sizeof(val));
for(int i=0;i<10;i++)
{
val['0'+i]=i;
recVal[i] ='0'+i;
}
val['A'] = 10;
val['B'] = 11;
val['C'] = 12;
val['D'] = 13;
val['E'] = 14;
val['F'] = 15;
recVal[10]='A';
recVal[11]='B';
recVal[12]='C';
recVal[13]='D';
recVal[14]='E';
recVal[15]='F';
scanf("%d",&k);
while(k--)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
num[i][j] = 0;
ch=getchar();
while(ch==' '||ch=='\n') ch=getchar();
num[i][j]+=val[ch]*16;
ch=getchar();
while(ch==' '||ch=='\n') ch=getchar();
num[i][j]+=val[ch];
}
}
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
res[i][j]=0;
for(int k=0;k<4;k++)
{
if(rec[i][k]==1) res[i][j]^=num[k][j];
else if(rec[i][k]==2)
{
tmp=(num[k][j]<<1);
if(tmp>255) tmp^=27;
res[i][j]^=tmp;
}
else
{
tmp = (num[k][j]<<1);
if(tmp>255) tmp^=27;
res[i][j]^=(num[k][j]^tmp);
}
}
}
}
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(j!=0) printf(" ");
ch=recVal[(res[i][j]/16)%16];
printf("%c",ch);
ch=recVal[res[i][j]%16];
printf("%c",ch);
}
printf("\n");
}
if(k) printf("\n");
}
return 0;
}