Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1585053
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2009-12-17 11:31:38

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) |
给主人留下些什么吧!~~