网格#
题目描述#
由火柴棍组成的n×m的网格,从上倒下,从左到右,火柴棍编号从1 到 2mn+m+n。
火柴棍的状态为1或者0。
我们取一个格子的火柴棍,所以每个格子有4根火柴棍,我们可以用一个16进制数来表示这个格子火柴棍的状态。
我们按左、上、右、下的顺序,依次对应2进制的第3∼0位。 比如,一个格子,左、上、右、下的火柴棍的状态依次1,0,1,1。 那么对应的2进制数为1011(2),其16进制为B。
现在已知网格的行列和所有火柴棍的状态,请按行列输出每个格子的状态。
输入格式#
第一行是一个整数T (1≤T≤100),表示样例的个数。
每个样例的第一行是两个整数n,m (1≤n,m≤50),表示网格的行与列数。 样例的第二行是一个长度为2mn+m+n的01串,依次表示各编号火柴棍的状态。
输出格式#
每个样例输出一个n×m的矩阵,矩阵元素为格子的状态数,用大写的A∼F表示16进制的10∼15。
每个样例之间输出一个空行。
样例输入#
2 2 1 1100001 2 3 11001110011110100
样例输出#
C 1 6EB BAC
思路:把字符串转换成火柴棒形式,然后模拟即可。
#include<stdio.h>
#include<string.h>
int net[110][55]={0};
char input[5500]={0};
int main()
{
int n,m,i,j,k,t,c,r,num;
scanf("%d",&k);
while(k--)
{
scanf("%d %d",&n,&m);
scanf("%s",input);
r=n*2+1,t=0;
for(i=0;i<r;i++)
{
//字符串转换为火柴棒的形式
if(i%2)
c=m+1;
else
c=m;
for(j=0;j<c;j++)
{
net[i][j]=input[t++]-'0';
}
}
for(i=1;i<=n;i++)
{
for(j=0;j<m;j++)
{
num=net[i*2-1][j]*8+net[i*2-2][j]*4+net[i*2-1][j+1]*2+net[i*2][j];
if(num<=9)
printf("%d",num);
else
{
printf("%c",'A'+num-10);
}
}
printf("\n");
}
memset(net,0,sizeof(net));
if(k>0)
printf("\n");
}
return 0;
}