| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5429 人关注过本帖
标题:一个关于方阵数组取值问题~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
任意交换两个数最优解的和都会增大这个没啥好证明的~但现在纠结的是它的逆命题~任意交换两个数其和都会增大的必然是最优解~这个命题是否成立~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-17 19:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:2 
以下是引用九转星河在2017-4-17 17:18:54的发言:

我用C-Free运行了一下发现有不支持的地方
 error: `copy_n' was not declared in this scope
 error: `iota' was not declared in this scope

copy_n,iota 在C++11时就进入标准了,我现在是C++17
你更新一下编译器,加上 -std=c++17 试试
2017-04-17 20:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 12楼 rjsp
这个我有时间看看怎么去更新~先谢过啦~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-17 21:27
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
其实这问题是一道灾区物资分配问题所引申出来的

假设现在在xoy坐标系里面有N个灾区,现在需要通过空投N个物资到该地区。但由于受天气和原因其它引起误差的因素物资降落地点会和期望降落到的灾区地点不同。物资通过空投降落后现在要尽量减少物资移动的总路线来重新把该物资分配到各个灾区。
第一行输入一个正整数N
接下来输入2*N行每一行包括两个浮点数,第一个是横坐标,第二个是纵坐标,中间用空格隔开
前面N行输入灾区坐标
后面N行输入实际救援物资的降落坐标

输出1行:救援物资重新分配到灾区移动的最小距离(结构保留两位小数)

示例:

输入:
3
1 1
2 1
3 3
1 2
3 2
2 3

输出:
3.41

感觉解决这个问题要对整体布局进行分析~
可以得出的信息就是各个灾区到各个救援物资之间的距离~

研究了一下解决方案就是要解决1楼的问题~一楼已经把这个实际问题简化了~

说个题外话~自己想看看那些动态规划以及其它类型的问题,发现一些高级一点的要用到高数知识例如线性代数~其中又看到欧拉函数啦表示一面懵逼~
所以感觉自己遇到真正上档次的题目发现自己还是很渺小啊~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-17 23:21
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:5 
程序代码:
#include <stdio.h>
#include <assert.h>

#define    MAX_ARY_LEN        (100)

unsigned int ary_len;
unsigned int two_ary[MAX_ARY_LEN][MAX_ARY_LEN];
struct{
        
    unsigned int row;    ///< 行
    unsigned int col;    ///< 列
    unsigned int val;    ///< 值
}list_st[MAX_ARY_LEN * MAX_ARY_LEN];
unsigned int row_ary[MAX_ARY_LEN];
unsigned int col_ary[MAX_ARY_LEN];

/**

 *\brief 捕获输入

 */
void get_input(void)
{
    unsigned int i = 0, j = 0;
    
    scanf("%u", &ary_len);
    
    assert(ary_len > 1 && ary_len <= 100);
    for (i = 0; i < ary_len; ++i){
        
        for (j = 0; j < ary_len; ++j){
            
            scanf("%u", &two_ary[i][j]);
            list_st[i * ary_len + j].row = i;
            list_st[i * ary_len + j].col = j;
            list_st[i * ary_len + j].val = two_ary[i][j];
        }
        
        row_ary[i] = ary_len;
        col_ary[i] = ary_len;
    }    
}

/**

 *\brief 对list_st 排序

 */
void sort_list(void)
{
    unsigned int total = ary_len * ary_len;
    unsigned int i = 0, j = 0;
    
    /* 选择 */
    for (i = 0; i < total; ++i){
        
        for (j = i + 1; j < total; ++j){
            
            if (list_st[i].val < list_st[j].val){
            
                list_st[i].row += list_st[j].row;
                list_st[i].col += list_st[j].col;
                list_st[i].val += list_st[j].val;
                list_st[j].row = list_st[i].row - list_st[j].row;
                list_st[j].col = list_st[i].col - list_st[j].col;
                list_st[j].val = list_st[i].val - list_st[j].val;
                list_st[i].row -= list_st[j].row;
                list_st[i].col -= list_st[j].col;
                list_st[i].val -= list_st[j].val;                
            }
        }
    }
}

/**

 *\brief 选择

 */
void select_num(void)
{
    unsigned int total = ary_len * ary_len;
    unsigned int i = 0, j = 0, sum = 0;
    
    /* 选择 */
    for (i = 0; i < total; ++i){
        
        unsigned int row = list_st[i].row;
        unsigned int col = list_st[i].col;
        if (row_ary[row] > 1 && col_ary[col] > 1){
            
            --row_ary[row];
            --col_ary[col];
        }else if(row_ary[row] == 1){/* 行唯一 */
        
            sum += list_st[i].val;
            printf("(%u, %u) ", row, col);
            --row_ary[row];
        }else{/* 列唯一 */
            
            sum += list_st[i].val;
            printf("(%u, %u) ", row, col);
            --col_ary[col];
        }
    }
    
    printf("\n sum[%u]\n", sum);
}

int main(void)
{
    get_input();
    
    sort_list();
    
    select_num();
    
    return 0;
}
2017-04-17 23:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 16楼 寒风中的细雨
谢啦~先拿你的代码研究研究~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-18 00:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 16楼 寒风中的细雨
图片附件: 游客没有浏览图片的权限,请 登录注册


先谢过了~
好像输出和计算还是出了点问题,这个案例答案应该是9再看看~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-18 00:25
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:5 
回复 17楼 九转星河
程序代码:

/**

 *\brief 选择

 */
void select_num(void)
{
    unsigned int total = ary_len * ary_len;
    unsigned int i = 0, j = 0, sum = 0;
    
    /* 选择 */
    for (i = 0; i < total; ++i){
        
        unsigned int row = list_st[i].row;
        unsigned int col = list_st[i].col;
        if (row_ary[row] > 1 && col_ary[col] > 1){
            
            --row_ary[row];
            --col_ary[col];
        }else if(row_ary[row] == 1){/* 行唯一 */
        
            sum += list_st[i].val;
            printf("(%u, %u) ", row, col);
            --row_ary[row];
            /* 剩余所有行 都要改变 */
            for (j = 0; j < ary_len; ++j){
                
                if (row_ary[j] > 0){
                    
                    --row_ary[j];
                }
            }
        }else if(col_ary[col] == 1){/* 列唯一 */
            
            sum += list_st[i].val;
            printf("(%u, %u) ", row, col);
            --col_ary[col];
            /* 剩余所有列 都要改变*/
            for (j = 0; j < ary_len; ++j){
                
                if (col_ary[j] > 0){
                    
                    --col_ary[j];
                }
            }            
        }
    }
    
    printf("\n sum[%u]\n", sum);
}
2017-04-18 01:19
lmlm1001
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:4
帖 子:107
专家分:550
注 册:2015-3-1
收藏
得分:5 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int compares(void *a, void *b);
int makeresult( struct s *des, struct s *src);
void printresult(struct s *input);
struct s {
        int value;
        int row;
        int col;
};
int main(void)
{
    clock_t t = clock();
    int i = 0, j = 0;
    struct s result[4];
    struct s tmp[16];
    int matrix[4][4] = {
        {1, 3, 5, 7, },
        {1, 1, 3, 5, },
        {3, 1, 1, 3, },
        {5, 3, 1, 1, },
    };

    for( i = 0; i < 4; i += 1 )
        for( j = 0; j < 4; j += 1 )
        {
            tmp[i * 4 + j].value = matrix[i][j];
            tmp[i * 4 + j].row = i;
            tmp[i * 4 + j].col = j;
        }

    for( i = 0; i < 16; i += 1 )
        printf("%d%c", tmp[i].value, 0 == (i + 1 & 3) ? '\n' : ' ');
    
    qsort(tmp, 16, sizeof tmp[0], compares);
    if( 4 == makeresult(result, tmp) )
        printresult(result);
    else
        printf("fatal error!\n");
    printf("\nthis program cost %f second!\n", (double)(clock() - t) / CLOCKS_PER_SEC);
    getchar();
    return 0;
}
int compares(void *a, void *b)
{
    if( ((struct s*)a)->value == ((struct s*)b)->value )
        return ((struct s*)a)->row + ((struct s*)a)->col == ((struct s*)b)->row + ((struct s*)b)->col ?
        ((struct s*)a)->row > ((struct s*)b)->row ? 1 : -1
        : ((struct s*)a)->row + ((struct s*)a)->col > ((struct s*)b)->row + ((struct s*)b)->col ? 1 : -1;
    else
        return ((struct s*)a)->value > ((struct s*)b)->value ? 1 : -1;
}
int makeresult( struct s *des, struct s *src)
{
    int i = 0, j = 0, count = 0, row = 0, col = 0;
    for( i = 0; i < 16; i += 1 )
        if( -1 != src[i].value )
        {
            memcpy(des++, src + i, sizeof(struct s));
            row = src[i].row;
            col = src[i].col;
            printf("%d, %d\n", src[i].row, src[i].col);
            for( j = 0; j < 16; j += 1 )
            {

                if( src[j].row == row )
                    src[j].value = -1;
                if( src[j].col == col )
                    src[j].value = -1;
            }
            count += 1;
        }
        else
            continue;
    return count;
}
void printresult(struct s *input)
{
    int i = 0, sum = 0;
    for( i = 0; i < 4; i += 1 )
    {
        printf("(%d, %d)\n", input[i].row, input[i].col);
        sum += input[i].value;
    }
    printf("sum = %d\n", sum);
    return;
}

不完全算法,当矩阵中的数字相差小的时候,结果不正确。
2017-04-18 01:34
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
跟上一帖的哈密顿回路一样的解法。

首先深搜全排列,获取第一个结果作为剪枝条件,后面搜的时候判断是否超过剪枝条件,超过就搜下一条,最后更新剪枝条件。

算法不难理解,效率在小数据量没有多大提升。

程序代码:
#include <stdio.h>
#include <limits.h>
#include <stdbool.h>

#define  N  4

bool visit[N];
int map[N][N], ans[N] = {0}, res;

void print(int len)
{
    for (int i = 0; i < len; ++i) printf("{%d, %d}, ", i + 1, ans[i] + 1);
    printf("%d\n", res);
}

void dfs(int len, int pos, int ss)
{
    if (len == pos)
    {
        if (res < ss) return;
        res = ss, print(len);
        return;
    }

    if (ss > res) return;  // 剪枝

    for (int i = 0; i < len; ++i)
    {
        if (visit[i]) continue;

        ans[pos] = i, visit[i] = true;
        dfs(len, pos + 1, ss + map[pos][i]);
        visit[i] = false;
    }
}

int main(int argc, char *argv[])
{
    int t;
    while (1 == scanf("%d", &t) && t)
    {
        res = INT_MAX;

        for (int i = 0; i < t * t; ++i) scanf("%d", &map[i % t][i / t]);

        dfs(t, 0, 0);
    }
    return 0;
}


[此贴子已经被作者于2017-4-18 16:16编辑过]

收到的鲜花
  • 九转星河2017-04-20 22:03 送鲜花  20朵   附言:通过了测试~好!!!~~~~


[fly]存在即是合理[/fly]
2017-04-18 09:18
快速回复:一个关于方阵数组取值问题~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024353 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved