#动态规划#missing number

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 45;

string s;


int n;
//vector<bool> vis(n+1,false);  //在这里定义是不行的,此时n还是0,所以默认vis只有1个空间

void backtrace(int index,int cnt,vector<bool>& vis) {
	if(index>=s.length()) {
		if(cnt==n-1) { //划分出了n-1个数字了
			//	cout<<"miao..."<<endl;
			vector<bool>::iterator it;
			it = find(vis.begin()+1,vis.end(),false);//false的下标是(排除掉0)
			//printf("%d",*it);
			//	cout<<it-vis.begin()<<endl;
			printf("%d\n",it-vis.begin());

//			for(int i=0; i<vis.size(); i++) {
				if(vis[i]==false)cout<<i<<endl;
//				cout<<"for..."<<endl;
//			}

			//	cout<<"vis.size():"<<vis.size()<<endl;//规模变成1了? 因为在main外面初始化时n还没有被赋值!


		}
		return;
	}

	if(s[index]=='0') return;//剪枝

	if(index<s.length()-1) {
		int tmp1 = (s[index]-'0')*10+(s[index+1]-'0');
		if(tmp1>=1 && tmp1<=n && vis[tmp1]==false) {
			//cout<<"tmp1:"<<tmp1<<endl;
			cnt++;
			vis[tmp1]=true;
			backtrace(index+2,cnt,vis);
			cnt--;
			vis[tmp1]=false;
		}
	}

/*下面这一块代码要放在index<s.length()-1外面,因为还有最后一个需要判断啊!!!!!!!!!!!!!!!!!!*/
	int tmp2 = s[index]-'0';
	if(tmp2>=1 && tmp2<=n &&!vis[tmp2]) {
		//cout<<"tmp2:"<<tmp2<<endl;

		cnt++;
		vis[tmp2]=true;
		backtrace(index+1,cnt,vis);
		cnt--;
		vis[tmp2]=false;
	}

	return;
}
int main() {
	scanf("%d",&n);

	vector<bool> vis(n+1,false);

	getchar();

	cin>>s;

	backtrace(0,0,vis);


	return 0;
}

代码参考自:https://blog.csdn.net/climber16/article/details/81604342

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值