【算法入门经典】 回溯法排列组合



排列:


#include<iostream>
using namespace std;

void pailie(int*a , int pos,int size,int * r,bool* visited)
{
	if(pos == 3)
	{
		for(int i=0;i<3;i++)
			cout<<r[i]<<' ';
		cout<<endl;
		return;
	}
	for(int i=0;i<size;i++)
	{
		if(visited[i]==false)
		{
			r[pos] = a[i];
			visited[i] = true;
			pailie(a,pos+1,size,r,visited);
			visited[i] = false;
		}
	}
}

int main()
{
	int a[4] = {1,2,3,4};
	int result[3] = {0};
	bool visited[4] = {false};
	pailie(a,0,4,result,visited);
}

组合:


#include<iostream>
using namespace std;

void pailie(int*a , int pos,int size,int * r,bool* visited,int h)
{
	if(pos == 3)
	{
		for(int i=0;i<3;i++)
			cout<<r[i]<<' ';
		cout<<endl;
		return;
	}
	for(int i=h;i<size;i++)
	{
		if(visited[i]==false)
		{
			r[pos] = a[i];
			visited[i] = true;
			pailie(a,pos+1,size,r,visited,i+1);
			visited[i] = false;
		}
	}
}

int main()
{
	int a[4] = {1,2,3,4};
	int result[3] = {0};
	bool visited[4] = {false};
	pailie(a,0,4,result,visited,0);
}




都通过回溯来做,组合的不同之处在于,每次选择了数组中的一个数字之后,记下标号,然后在选择下一个数字时,其位置应该在这个标号之后。


由此引申到hdoj1015的回溯方法,在hdoj1015中有一点要注意,就是char数组最后输出之前,要在末尾加上'\0'

或者在初始定义数组时候,全部清零。

比如:

char a[10] = {0};   -------------静态

或者

char* a = new char[size];   -----------------动态

memset(a,0,size);


总之应该多留一位


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值