100分!!!!!!!!!!!!!!!紧急求助一个编程题!!!!!!!!!!!!!!!

booming 2004-01-08 10:23:23
200分!!!!!!!!!!!!!!!紧急求助一个编程题!!!!!!!!!!!!!!!
int A[N],//A[]中存放0--N-1的一个排列
int B[N][N];//B[i][j]值已设定,但不知。
现在编写一个程序调整B[i][j],使得调整B[i][j]为调整前的B[A[i]][A[j]].
(请问:这道题能不开辟任何工作数组做出来吗?谢谢!)
我只会做一维的情况,请大侠们帮我做二维的情况。
...全文
87 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnefuil 2004-01-09
  • 打赏
  • 举报
回复
按你上面的例子,接下来考虑b[0][1],b[0][2],b[0][3],b[1][0]....依次下去
就是说外面有一个2重循环分别检验每个b[i][j]
交换好的元素一定满足b[i][j]=b[a[i]][a[j]]的性质
没有交换好的元素一定不满足这个性质,那么就按照上面的算法去交换
booming 2004-01-09
  • 打赏
  • 举报
回复
如果换一个元素继续,那以后我咋知道某个元素是否已经交换好了?

这里又不能对A[]设置标志。
booming 2004-01-09
  • 打赏
  • 举报
回复
我开始也这么想。但,
A[]= { 3 2 1 0}
B[]=3{ a b c d}
2{ e f g h}
1{ i j k l}
0{ m n o p}
那么b[0][0]要b[3][3],暂存a,把p付给b[0][0];
下面谁要a,b[3][3]要。则把a付给b[3][3].
请问,接下来咋办?
gnefuil 2004-01-09
  • 打赏
  • 举报
回复
大于0的整数也好,实数也好,或者是任何的指针,都可以通过取负进行标记
如果存在小于0的数,先把原来的数组处理一下,比如所有数都减去最小值


booming 2004-01-09
  • 打赏
  • 举报
回复
而且,你对B【】【】取一个值后,以后要恢复,咋恢复?

如果B[][]取最大值吧,今后咋知道恢复到哪里?

加上某个特定值吧,如果B[][]很大呢?又不行。

我在想,能不能用递归,这样至少可以不显式的开辟数组。
但似乎没有递归出口,还是那句话,没法做标志!!!

但愿不要考到!!!



booming 2004-01-09
  • 打赏
  • 举报
回复
b[][]本身做标志不妥,以为b[][]不一定为int
gnefuil 2004-01-09
  • 打赏
  • 举报
回复
前面讲的算法确实有问题,就是如楼上所指出的那样
但仍然可以通过不增加额外空间加以解决,可以用b数组本身做标记
比如将所有已经交换过的位置取个负,或者加上最大值等等
因为b数组是可写的,所以利用这个性质进行标记
ZeroZZZ000 2004-01-09
  • 打赏
  • 举报
回复
首先,Ai<>Aj(i<>j),既A[i]=A[j]当且仅当i==j,
所以保证了每个Bij只被读写一次,所以只要进行
tmp=Bij,B[Ai][Aj]=Bij....Bnm=tmp(当n=Ai,m=Aj时)
辅助空间为TMP,ti,tj三个
( mysword(一怒拔剑)的交换好的元素一定满足b[i][j]=b[a[i]][a[j]]的性质
判断方法是不对的,比如当A={3,0,1,2}时,只有当每次循环只涉及两元素的特
殊情况时才是有效的)

真正的难点是当一次循环结束后会有一部分B被置换,另一部分还没被置换的情
况,我认为只有增加标志数组了,长度是n(n+1)/2,可以用位操作再把标志数组
的空间要求降低,标志对象为矩阵的上三角。
如果实在不能增加标志数组我想应该从矩阵的佚上去考虑
gnefuil 2004-01-09
  • 打赏
  • 举报
回复

b[i][j]是交换过的
而b[a[i]][a[j]]中的值是没交换时候的数据,不一样的啊
交换以前的b[a[3]][a[3]]不是等于a么?
gnefuil 2004-01-09
  • 打赏
  • 举报
回复
这样就是向相反方向去循环,似乎是不行的
如果碰不到b[m][n]使a[m]=i,a[n]=j呢?比如到一个地方就停止了
b[i][j]的数据就丢失了?
booming 2004-01-09
  • 打赏
  • 举报
回复
好像有点不不理解:

如上面的例子:
B[0][0]和B[3][3]交换后,B[0][0]=p,B[3][3]=a
以后再碰到i=3,j=3时,a=B[i][j]=B[A[i]][A[j]]=B[0][0]=p
似乎不等啊?
还望详细指教。
booming 2004-01-09
  • 打赏
  • 举报
回复
高手就是高手,我咋没想到这个性质呢?


另外,我想这样交换:
tmp=B[i][j]
B[i][j]=B[A[i]][A[j]],令i'=A[i],j'=A[j]
B[i'][j']=B[A[i'']][A[j'']],
.....
碰到一个B[m][n],A[m]=i,A[n]=j时,把tmp付给B[m][n],此时说明一个循环组结束。
那么,取下一个b[i][j]!=b[a[i]][a[j]],依旧做上面的步骤......
直至全部元素都交换过。
不知道可以否?
booming 2004-01-08
  • 打赏
  • 举报
回复
马上要考试了,这道题要在24小时之内搞会啊。

帮帮我。
gnefuil 2004-01-08
  • 打赏
  • 举报
回复
可以不通过工作数组来做
B[i][j]想要得到B[A[i]][A[j]]的值,那么把B[A[i]][A[j]]的值赋给B[i][j]
用一个临时变量保存B[i][j]原来的值
现在在找到哪一个位置想要B[i][j]的值
设这个位置为B[i'][j'] 其中A[i']=i A[j']=j
也就是说B[i'][j']想要B[A[i']][A[j']]的值,而恰好A[i']=i且A[j']=j
现在把刚才保留的B[i][j]的原始值赋给B[i'][j']
然后用那个临时变量存储B[i'][j']原来的值
就一直这样下去,直到B[i''][j'']=B[A[i'']][A[j'']]
对于每个i,j,都对B[i][j]做以上的操作就可以了
这里值用到了一个临时变量,以及循环变量,空间复杂度是O(1)
满足你题目的要求

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧