0.8poj2078(回溯||dfs)

http://poj.org/problem?id=2078
Matrix
Time Limit: 2000MS
Memory Limit: 30000K
Total Submissions: 3022
Accepted: 1561

Description

Given an n*n matrix A, whose entries Ai,j are integer numbers ( 0 <= i < n, 0 <= j < n ). An operation SHIFT at row i ( 0 <= i < n ) will move the integers in the row one position right, and the rightmost integer will wrap around to the leftmost column.
0.8poj2078(回溯||dfs)

You can do the SHIFT operation at arbitrary row, and as many times as you like. Your task is to minimize
max0<=j< n{Cj|Cj=Σ0<=i< nAi,j}

Input

The input consists of several test cases. The first line of each test case contains an integer n. Each of the following n lines contains n integers, indicating the matrix A. The input is terminated by a single line with an integer −1. You may assume that 1 <= n <= 7 and |A i,j| < 10 4.

Output

For each test case, print a line containing the minimum value of the maximum of column sums.

Sample Input

2

4 6
3 7
3
1 2 3
4 5 6
7 8 9
-1

Sample Output

11
15

Source

给一个n*n的数组,数组元素都为整数,数组的每行可以循环右移,每次循环移动后,把每列的元素加起来所得的结果中找出一个最大的值,每次循环移动后都可以得到一个最大值,在这所有最大值中找出最小的结果输出。如有数组:
1 2 3
4 5 6
7 8 9
下面是该数组的求解过程:max:18 17 16 17 16 15 16 15 17

在所有得到的max中找出最小值:15。最后输出15。

解题思路:

本题意思是矩阵的每个行都可以向→移动 然后把所有相同列的元素相加取其中列和最大值,然后输出列最大值中的最小值,我直接用的n^n的暴力搜索,生成一颗n叉的树,然后把每次的值都求出来保存最小的值最后输出该最小值。。

嗨,在最小值这边纠结了还久啊啊啊呵。。。

#include <iostream>
#include <algorithm>
using namespace std;
int n;
int a[8][8];
int ans;
void  rota(int i)
{
    int temp;
    temp=a[i][n-1];//一行里面最后一个元素
    int j;
    for(j=n-2;j>=0;j--)//每个元素向后移动一位
        a[i][j+1]=a[i][j];
    a[i][0]=temp;//原来的最后一个元素插到最前面
}
void solve(int i)
{
    if (i==n)
    {
        int sum;
        int max;
        int j;
        max=0x80000000;
        for (i=0;i<n;i++)//求每一列的和
        {
            sum=0;
            for (j=0;j<n;j++)
            {
                sum+=a[j][i];
            }
            if (sum>max)//更新最大值
            {
                max=sum;
            }
        }
        if(max<ans)//*********这个地方不理解
        {
            ans=max;
            return ;
        }
    }
    else
    {
        int k;
        for(k=0;k<n;k++)
        {
            rota(i);//移动元素
            solve(i+1);
        }
    }
}
int main()
{
    int i,j;
    while(cin>>n && n!=-1)
    {
        for (i=0;i<n;i++)
        {
            for (j=0;j<n;j++)
            {
                cin>>a[i][j];
            }
        }
        ans=0x7fffffff;
        solve(0);
        cout<<ans<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值