| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 628 人关注过本帖
标题:[求助]2道算法的题目,没做出来
只看楼主 加入收藏
Sola
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-6-26
收藏
 问题点数:0 回复次数:2 
[求助]2道算法的题目,没做出来

题目:
一、编写一个程序,输入一个数字n,让其组成一个二维数组int i[][]=i[n][n]。然后输出这个数组的所有值,并让这些值呈螺旋状由外到里排列出来。

如:输入一个5,则数组为 int i[][]=i[5][5]
输出结果为:

i[0][0] i[0][1] i[0][2] i[0][3] i[0][4]
i[3][0] i[3][1] i[3][2] i[3][3] i[1][0]
i[2][4] i[4][3] i[4][4] i[3][4] i[1][1]
i[2][3] i[4][2] i[4][1] i[4][0] i[1][2]
i[2][2] i[2][1] i[2][0] i[1][4] i[1][3]

即——若i[0][0]=1则最终显示结果为:

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
------------------------------------------
从1到N(100000)中任意拿掉两个数,把剩下的99998个数顺序打乱,并且放入数组A中。要求只扫描一遍数组,把这两个数找出来。可以使用最多不超过5个局部变量,不能用数组变量,并且不能改变原数组的值。

搜索更多相关主题的帖子: 算法 
2007-06-26 00:22
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
收藏
得分:0 
first problem is discussed in [全民编程]76道高难度C++练习题.含NOI竞赛题.欢迎挑战, http://bbs.bc-cn.net/viewthread.php?tid=147967, #6.

2nd problem is a little bit harder. I have a working c++ algorithm following all the requirements stated in the problem. I would like to give some hints to you so that you can do it yourself, instead of looking at my source code.

(a) Let N=100000. Define two integers

xor_a := a_0 ^ a_1^ ... a^{N-3}
xor_1N := 1^ 2 ^3 ^ ... ^N.

Then

xor_a ^ xor_1N = m1 ^ m2,

where m1 and m2 are the two missing numbers.

(b) We need extra info to extract m1 and m2 from m1 ^ m2. You can verify that

if i ^ j == m1 ^ m2 and i * j == m1 * m2, then i == m1, j == m2 or i == m2, j == m1.

However, to get the product m1 * m2, you need some careful handling.


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-06-26 08:42
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 

程序代码:

//***********************************
//螺旋矩阵
//***********************************
#include <iostream.h>
#include <stdio.h>
#define MAX 11

int array[MAX][MAX];
int Row;
int temp;

void GoRight(int &a,int &m)
{
for(temp=1;temp<=Row;temp++)
if(array[a][temp]==0)
array[a][temp]=m++;
a++;
}

void GoDown(int &b,int &m)
{
for(temp=1;temp<=Row;temp++)
if(array[temp][b]==0)
array[temp][b]=m++;
b--;
}

void GoLeft(int &c,int &m)
{
for(temp=Row;temp>0;temp--)
if(array[c][temp]==0)
array[c][temp]=m++;
c--;
}

void GoUp(int &d,int &m)
{
for(temp=Row;temp>0;temp--)
if(array[temp][d]==0)
array[temp][d]=m++;
d++;
}

int main()
{
int a,b,c,d,max,m;
cout<<\"输入维数:\";
cin>>Row;
for(a=1;a<=Row;a++)
for(b=1;b<=Row;b++)
array[a][b]=0;

m=1,a=1,b=Row,c=Row,d=1;
max=Row*Row;

while(m<=max)
{
GoRight(a,m);
GoDown(b,m);
GoLeft(c,m);
GoUp(d,m);
}

for(a=1;a<=Row;a++)
{
for(b=1;b<=Row;b++)
printf(\"%3d\",array[a][b]);
cout<<endl;
}

return 0;
}


Viva,espana!
2007-06-26 09:21
快速回复:[求助]2道算法的题目,没做出来
数据加载中...
 
   



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

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