求算法,喜欢思考的人进来看看

javaboy_2008 2009-10-09 08:10:57
题目如下
有一个数组A[8]={0,1,2,3,4,5,6,7}
编写c++程序使得得到的数组相邻的数之间的差大于或等于二,要求得出全部的可能
合法答案
例如:{0,2,4,6,3,1,5,7}
最好用递归实现,因为本人对递归不是很懂,希望能给出代码的多写一点注释
小弟在这里先谢谢各位大侠了
如果对题目有疑问或则说的不清楚,在回复里面问,我也第一时间回答你的疑问
再次感谢!
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
donglq 2009-10-11
  • 打赏
  • 举报
回复
马克
mstlq 2009-10-10
  • 打赏
  • 举报
回复
贴个getA(A,0,5)的结果……
8的太长,贴不下

0 2 4 1 3
0 3 1 4 2
1 3 0 2 4
1 3 0 4 2
1 4 2 0 3
2 0 3 1 4
2 0 4 1 3
2 4 0 3 1
2 4 1 3 0
3 1 4 0 2
3 1 4 2 0
3 0 2 4 1
4 1 3 0 2
4 2 0 3 1
mstlq 2009-10-10
  • 打赏
  • 举报
回复
2楼有一小bug,而且通用性不佳,修正如下:

#include <iostream>
#include <cmath>
using namespace std;

void swap(int A[],int i,int j)
{
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
return;
}

void showA(int A[],int len)
{
for (int i=0;i<len;++i)
cout<<A[i]<<'\t';
cout<<endl;
return ;
}

void getA(int A[],int dep,int len)
{
if (dep > 1 && abs(A[dep-1]-A[dep-2])<2) return;
if (dep == len)
showA(A,len);
else
for (int i=dep;i<len;++i)
{
swap(A,dep,i);
getA(A,dep+1,len);
swap(A,dep,i);
}
return;
};

int main()
{
int A[8]={0,1,2,3,4,5,6,7};
getA(A,0,8);
return 0;
}
mstlq 2009-10-10
  • 打赏
  • 举报
回复

#include <iostream>
#include <cmath>
using namespace std;

void swap(int A[],int i,int j)
{
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
return;
}

void showA(int A[],int len)
{
for (int i=0;i<len;++i)
cout<<A[i]<<'\t';
cout<<endl;
return ;
}

void getA(int A[],int dep,int len)
{
if (dep > 2 && abs(A[dep-1]-A[dep-2])<2) return;
if (dep == 8)
{
showA(A,8);
return;
}
for (int i=dep;i<len;++i)
{
swap(A,dep,i);
getA(A,dep+1,len);
swap(A,dep,i);
}
return;
};

int main()
{
int A[8]={0,1,2,3,4,5,6,7};
getA(A,0,8);
return 0;
}
javaboy_2008 2009-10-10
  • 打赏
  • 举报
回复
下面谈谈我出该题的本意
我本来是要做一道关于八皇后的问题
通过观察结果发现上面的规律
于是想通过另一种方式求解
不知道是否行的通,大家发表意见
如果行得通,大家觉得效率如何
javaboy_2008 2009-10-10
  • 打赏
  • 举报
回复
谢谢各位
lctlx2 2009-10-10
  • 打赏
  • 举报
回复
mark下
zhgfzhgf212 2009-10-10
  • 打赏
  • 举报
回复
帮顶!
li648918708 2009-10-10
  • 打赏
  • 举报
回复
个人觉得不会太难,for可以搞定,必相等和比差2差不多,呵呵
diablox0147 2009-10-10
  • 打赏
  • 举报
回复
hmm。。。看過離散數學的視頻,在組合那裡,裡面只有講怎么找出所有組合的數目,
看來要怎么找出所有類型的組合還要自己好好研究下。。。
mstlq 2009-10-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 diablox0147 的回复:]

不過我不明白的是,你是怎么確定這樣就能檢查所有的組合呢?
[/Quote]

if (dep > 1 && abs(A[dep-1]-A[dep-2])<2) return;
如果注释掉上面那句,那么我那段代码的功能则是“输出全排列”……
diablox0147 2009-10-10
  • 打赏
  • 举报
回复
LS的換頭像了。。。就在剛....才,你果然是EVA的FANS呢。。。


我看了下你的算法。。。說下吧,看看我是不是理解了。
先找出所有可能的組合,每次排到最後的時候如果符合要求的話就輸出

細節就是從最近相連的2個元素開始排列,相連的全部組合檢查完畢后檢查格一個元素的組合,,,,檢查好了后檢查格2個元素的。。。。就這樣直到格7個,這樣也就檢查完了所有的組合。。。是這樣么?
不過我不明白的是,你是怎么確定這樣就能檢查所有的組合呢?
zhoen 2009-10-09
  • 打赏
  • 举报
回复
不会的东西才要学的!

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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