求最简单的穷举算法

zoehugh 2006-12-06 08:45:25
打印0 1 2排列的每一种情况

效果如下:
0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0

怎么来实现??
不能直接打印出来!
...全文
252 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
picoolo1124 2006-12-07
  • 打赏
  • 举报
回复
#include <iostream>
#define LEN 4
using namespace std;

struct NODE
{
int data;
bool selected;
};

static NODE node[LEN];
static buffer[LEN];
static step;

void init( )
{
for( int i=0; i<LEN; ++i )
{
buffer[i] = 0;
node[i].data = i;
node[i].selected = false;
}
}

void P( )
{
int count = 0;
if( step == LEN )
{
for( int i=0; i<LEN; ++i )
{
cout << buffer[i] << ' ';
}
cout << endl;
}
else
{
for( int i=0; i<LEN; ++i )
{
if( node[i].selected == true )
{
continue;
}
else
{
buffer[step] = i;
node[i].selected = true;
++count;
++step;
P( );
--step;
if( ( count+step) <= LEN )
{
node[i].selected = false;
}
}
}
}
}

int tmain()
{
for(int i=0; i<LEN; ++i )
{
init();
buffer[0] = i;
node[i].selected = true;
step = 1;
P( );
}

system("Pause");
return 0;
}
Alan_lz 2006-12-06
  • 打赏
  • 举报
回复
一般说来,递归的程序写起来是比较简单的。

用了递归,主要的目的是,可以满足n为任意数。

如果n比较大,我的程序运行比较慢是因为要输出的愿意。
可以用print2()试一下。程序很快就会结束。

如下:

#include <stdio.h>
#include <memory.h>

#define N 10

int flag[N];

int n;

int stack[N];
int top;

void print1()
{
int i;
for (i = 0; i < n; i++)
printf("%d ", stack[i]);
printf("\n");
}

void print2()
{
int i;
for (i = 0; i < n; i++)
;
}

void fun()
{
int i;
if (top == n-1)
{
print1();
return;
}
for (i = 0; i < n; i++)
{
if(flag[i] == 0)
{
flag[i] = 1;
stack[++top] = i;
fun();
top--;
flag[i] = 0;
}
}
}

void main()
{
memset(flag, 0, sizeof(int) * N);
//scanf("%d", &n);
n = 5;

top = -1;
fun();
}
pluton 2006-12-06
  • 打赏
  • 举报
回复
//粗写了下,a[]可以换成手动输入
#include <stdio.h>

int flag[3];
int a[3] = {0,1,2};

void print(int b[],int n)
{
int i;
if(n==3)
{
for(i=0;i<3;i++)
{
printf("%d ",b[i]);
}
printf("\n");
return ;
}
for(i=0;i<3;i++)
{
if(flag[i] == 0)
{
flag[i] = 1;
b[n] = a[i];
print(b,n+1);
flag[i] = 0;
}
}
}
int main()
{
int b[3];
int i;
for(i=0;i<3;i++)
{
flag[i] = 1;
b[0] = a[i];
print(b,1);
flag[i] = 0;
}
return 0;
}
zoehugh 2006-12-06
  • 打赏
  • 举报
回复
如果用这样的算法算0-10的穷举不是吓死人.0-100更恐怖!
picoolo1124 2006-12-06
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
int array[3]={0,1,2};
int i,j,k;

for( i=0; i < 3; ++i)
{
for( j=0; j < 3; ++j)
{
if( array[j] == array[i] )
continue;
for( k=0; k < 3; ++k)
{
if( array[k] == array[j] || array[k] == array[i] )
continue;
cout << array[i] << ' '
<< array[j] << ' '
<< array[k] <<endl;
}
}
}
system("Pause");
return 0;
}

输出:
0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0
zoehugh 2006-12-06
  • 打赏
  • 举报
回复
怎么没有人进来看看?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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