【题解】集训day4


这里只写一部分题解,后两题。(E 还没弄出来,明天再搞吧[大哭])


F. FBI 树

这道题主要就是递归,后序遍历。(左-右-根)

当 $len1$ 为 $1$ 的时候就输出同时 return

#include
#include
#include
using namespace std;
int n,len1;
char s[100009];//数字串 

void build(char s1[100009]){

	len1 = strlen(s1);
//	printf("len1:%d\n",len1);
	if(len1 == 1){
		if(s1[0] == '0')cout << 'B';
		if(s1[0] == '1')cout << 'I';
		return;
	}
	char left[10009],right[10009];
	for(int i=0; i> n;
	cin >> s;
	len1 = strlen(s);
	build(s);
	return 0;
}

然后我写的时候有个玄学错误也不知道为啥,改了一下就过了(



G. 火星人

20pts 做法:枚举所有的排列。(也就是全排列问题)这种做法很好想,但是会 T 飞。

100pts 做法:只不过这次也是搜索排列,但是我们从它给出的那个排列开始搜索。

#include
using namespace std;
int n;
int m;
int a[1100009];//火星人的排列顺序
int vis[100009];
int s[1000009];
int f1 = 0;
int sum=0,pos=-1,wants;
void dfs(int step){
	if(step == n+1){
		f1 = 1;
		sum++;
		if(sum == m+1){
			for(int i=1; i<=n; i++)cout << s[i] << ' ';
			exit(0);
		}
		return;
	}
	for(int i=1; i<=n; i++){
		if(vis[i] == 0){
			s[step] = i;
			if(f1 == 0 && s[step] != a[step])continue;
			vis[i] = 1;
			dfs(step+1);
			vis[i] = 0;
		}
	}
}

int main(){
	cin >> n >> m;
	for(int i=1; i<=n; i++){
		cin >> a[i];
	}
	
	dfs(1);//还没有填位置1 
	return 0;
}