int n; //矩阵的阶
int s[8]; //路径,表明每行移动的次数
//函数将序号化为移动的序列,也就是解的路径,实际并不移动,只是记录偏移量而已
void inttoseries(int i,int *s)
{
//第0行不用移动,相对论
for(int k=1,j=i;k {
s[k]=j%n;
j/=n;
}
}
//函数返回指定路径下的最大值
int max_column_sum(int *s)
{
//防止测试数据全为负数,所以不宜自己设置最值,第0列的和为初始值
for(int max=maxtrix[0][0],i=1;i max+= matrix[i][s[i]];
//计算第j列的和
for(int j=1;j {
//s[i]为第i行的偏移量,而第j列的最原始位置就是j,第0列当然就是0了
for(int i=1,temp=maxtrix[0][j];i temp+=maxtrix[i][(s[i]+j)%n ];
if(temp>max)
max=temp;
}
return max; //返回最大值
}
int main()
{
int min;
//直至n为-1为止
while(scanf("%d",&n),n+1)
{
inttoseries(0,s); //最开始给定的矩阵,所有行都无移动
min = max_column_sum(s);//最开始给定的矩阵和的最大值作为列和最小值的初始值
for(int i=1;i {
inttoseries(i,s); //第i条路径
temp = max_column_sum(s); //第i条路径矩阵列和的最大值
if(temp min=temp;
}
printf("%d\n",min);
}
}
阅读(1569) | 评论(0) | 转发(0) |