这道题我想应该对回溯有一定的理解,我当初就没理解好,以至于不会用,这个回溯递归很好的解决我的有几个n就套几个for循环的白痴想法
#include<iostream>
using namespace std;
int n;
int a[10][10];
int max()// 求每个矩阵的最大列和
{
int sum=-0xFFFF;
for(int j=1;j<=n;j++)
{
int cou=0;
for(int i=1;i<=n;i++)
cou+=a[i][j];
if(cou>sum)
sum=cou;
}
return sum;
}
int min1;
void move(int i)//行移动
{
int temp=a[i][1];
for(int j=1;j<n;j++)
a[i][j]=a[i][j+1];
a[i][n]=temp;
}
void solve(int i)//递归移动求和
{
if(i>=n)//核心,只有当i移到最下面才开始计算
{
int t=max();
if(t<min1)
min1=t;
}
else
{
int temp=n;
while(temp--)//移动n次
{
move(i);//移动当前行
solve(i+1);//解决下一行问题
}
}
}
int main()
{
while(scanf("%d",&n),n!=-1)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
min1=0xFFFF;
solve(1);
cout<<min1<<endl;
}
return 0;
}