俄罗斯套娃奖品 有没有有想法的啊.急.伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉.首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/28 19:25:37
俄罗斯套娃奖品 有没有有想法的啊.急.伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉.首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这

俄罗斯套娃奖品 有没有有想法的啊.急.伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉.首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这
俄罗斯套娃奖品
有没有有想法的啊.急.
伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉.首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这片草原,南北向和东西向的道路纵横交错.现在,路口放着纯金打造的俄罗斯娃娃,重量大小不等,重的都能装下轻的.你可以沿着道路飞奔,拾取路口的娃娃,要求是任何时刻必须是一个套娃,装好后就不能再拆开了.注意不要走重复路.”
请你为伊万洛夫规划路线,使得他能够有最大的收获.
Input:cross.txt
输入包括多组测试用例;
每个测试用例开始是一对整数,r表示东西向道路数,c表示南北向道路总数;接下来r行,每行包括c正整数wr,c,分别表示第r条东西向道路与第c条南北向道路交叉处路口放置的俄罗斯娃娃的重量.
Output:
输出能有最大收获的路径规划

俄罗斯套娃奖品 有没有有想法的啊.急.伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉.首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这
hnac8308给的程序是错误的 伊万洛夫路径就是找坐标上下左右中未走过的值中的最小值 就不对了 谁说要找最小的 最小的万一在一个死角里 岂不是挣个程序就是死的了

作为一个竞赛题目,中兴是不提倡大家发到网络上的。大家各有各的思路,可以私下讨论,而不是在网络上寻求高手的帮助。那样这次竞赛的目的就没有达到。楼主说对吗?

多少给点分咯?
没有从文件里读数据
不过搜索功能已经实现了
在gcc中验证过
#include
#define LIMIT -1 //边界标记
#define MAXROW 5 //行数
#define MAXLINE 5 //列数
//标记将移动方向
// up
//...

全部展开

多少给点分咯?
没有从文件里读数据
不过搜索功能已经实现了
在gcc中验证过
#include
#define LIMIT -1 //边界标记
#define MAXROW 5 //行数
#define MAXLINE 5 //列数
//标记将移动方向
// up
// ↑
// left ← → right
// ↓
// down
#define WHEREUP 1
#define WHEREDOWN 2
#define WHERELEFT 3
#define WHERERIGHT 4
struct tap_t
{
int up; //存储坐标点上下左右 四个数
int down;
int left;
int right;

int way; //移动的方向
};
struct path_t //路径结构体
{
int find_path[MAXROW*MAXLINE];
int find_num; //个数
};
//伊万洛夫路径就是找坐标上下左右中未走过的值中的最小值
static int _min(struct tap_t *buf)
{
int min = (buf->up != LIMIT)? buf->up:((buf->down != LIMIT)?
buf->down:((buf->left != LIMIT)? buf->left: buf->right));

if((buf->up!= LIMIT)&&(min >= buf->up)){min = buf->up;buf->way =WHEREUP;} // ->way标记将向那个方向走
if ((buf->down != LIMIT)&&(min >= buf->down)){ min = buf->down;buf->way = WHEREDOWN;}
if ((buf->left!= LIMIT)&&(min >= buf->left)){ min = buf->left;buf->way = WHERELEFT;}
if ((buf->right!= LIMIT)&&(min >= buf->right)){ min = buf->right;buf->way = WHERERIGHT;}

return min;
}
//cross:搜索数组,x_pos、y_pos:指定的起点, _path: 找到的路径信息
void _path_search (int cross[][MAXLINE], int x_pos, int y_pos, struct path_t *_path)
{

int dat = cross[x_pos][y_pos];
int min;
int i,j,k,n;

struct tap_t _tap; //存放当前值的四方数值

i = x_pos;
j = y_pos;
k = 0;
for (n=0; n {
_path->find_path[k++] = dat;
_path->find_num = k;

_tap.left = (cross[i][j-1]>dat)? cross[i][j-1]: LIMIT;//走过的路径标记为 -1
_tap.right = (cross[i][j+1]>dat)? cross[i][j+1]: LIMIT;
_tap.up = (cross[i-1][j]>dat)? cross[i-1][j]: LIMIT;
_tap.down = (cross[i+1][j]>dat)? cross[i+1][j]: LIMIT;

if (i == 0) _tap.up = LIMIT; //越界值处理为 -1
if (i == MAXROW - 1) _tap.down = LIMIT;
if (j == 0) _tap.left = LIMIT;
if (j == MAXLINE - 1) _tap.right = LIMIT;

min = _min(&_tap);
if(min >= dat) dat = min;
else break;

if ((_tap.way == WHEREUP)) i--; //下一步向上移动
if ((_tap.way == WHEREDOWN)) i++;
if ((_tap.way == WHERELEFT)) j--;
if ((_tap.way == WHERERIGHT)) j++;
}
}
int main(void)
{
int i,j;
int rou[MAXROW][MAXLINE] = {{1, 16, 15, 14, 13},
{2, 17, 24, 23, 12},
{3, 18, 25, 22, 11},
{4, 19, 20, 21, 10},
{5, 6, 7, 8, 9}};
struct path_t path;

printf("source cross:\n");
for (i=0; i {
for(j=0; j printf("%2d ",rou[i][j]);
printf("\n");
}

_path_search(rou,0,0,&path);

printf ("path:\n");
for (i=0;i printf ("%d ",path.find_path[i]);
printf ("\n");
return 0;
}
排版不好看,自己整理一下。

收起

hetao的说法欠缺,因为是不能走斜线的,即便到了拐角,只要旁边还有比它大的就可以走,但是他的理由是正确的,不是要找最小的,而是找和最大的!

lz是参加中兴的竞赛吧,这个我做出来了,不过很遗憾不能发给你,我觉得这个毕竟是自己的一次很好的经历

我也参加比赛了。。。对你的这种方式有点无语。。