矩阵最大值
题目描述:
给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下:
每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。
允许通过向左或向右整体循环移动每行元素来改变各元素在行中的位置。 比如:
[1,0,1,1,1]向右整体循环移动2位变为[1,1,1,0,1],二进制数为11101,值为29。
[1,0,1,1,1]向左整体循环移动2位变为[1,1,1,1,0],二进制数为11110,值为30。
输入描述:
输入的第一行为正整数,记录了N的大小,0 < N <= 20。
输入的第2到N+1行为二维矩阵信息,行内元素半角逗号分隔。
输出描述:
矩阵的最大值。
int main(int argc, char *argv[]) {
int n,num=0,x=0,d[20]={0};
char b[40][40]={0},*p,(*q)[40],c[20]={0};
q=b;
scanf("%d",&n);
getchar();
for(int i=0;i<=n-1;i++){
gets(q+i);
}
for(int j=0;j<=n-1;j++){
int idx=0;
p=strtok(q+j,",");
while(p!=NULL){
c[idx]=*p;
idx++;
p=strtok(NULL,",");
}
int lenl=strlen(c);
for(int k=0;k<=lenl-1;k++){
// printf("%d\n",LM(c,k));
d[k]=LM(c,k);
}
num=max(d);
x=x+num;
idx=0,num=0;
}
printf("%d\n",x);
return 0;
}
int LM(char *pstr,int steps)
{
int len=strlen(pstr);
int m=len-steps;
int ans=0;
char tmp[40];
strcpy(tmp,pstr+m);
strcpy(tmp+steps,pstr);
tmp[len]='\0';
for(int i=0;i<=len-1;i++){
ans=ans+(tmp[i]-'0')*pow(2,len-1-i);
}
return(ans);
}
int max(int *qstr){
int max1=0;
for(int i=0;i<=20;i++){
if(qstr[i]>=max1)
max1=qstr[i];
}
return(max1);
}