题目传送门

A 小W选数字

B 小W玩接龙1

C 小W来分组

D 小W建围墙

E 小W的密码

F 小W玩接龙2

T1 小W选数字

思路

爆搜模板!!!!!!!!!!

代码

#include<bits/stdc++.h>
using namespace std;
int n,r,a[111],st[110];
void dfs(int w,int s){
	if(w>r){
		for(int i=1;i<=r;i++)cout<<"  "<<a[i];
		cout<<"\n";
		return;
	}
	for(int i=s+1;i<=n;i++){
		if(!st[i]){
			st[i]=1;
			a[w]=i;
			dfs(w+1,i);
			st[i]=0;
		}
	}
}
int main(){
	freopen("xsz.in","r",stdin);
	freopen("xsz.out","w",stdout);
	cin>>n>>r;
	dfs(1,0);
}

T2 小W玩接龙1

错的点

一些小细节没注意(如值的记录)以后要认真一点

思路

每次看看可以再和哪个单词接,如果可以搜就搜下去,直到不可以了

代码

#include<bits/stdc++.h>
using namespace std;
string s[111];
int st[111],n,ma=-100000;
void dfs(int w,int c){
	ma=max(c,ma);
	for(int i=2;i<=n;i++){
		if(!st[i]&&i!=w){
			if(w!=0&&s[w][1]!=s[i][0])continue;
			st[i]=1;
			dfs(i,c+1);
			st[i]=0;
		}
	}

}
int main(){
	freopen("JL.in","r",stdin);
	freopen("JL.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>s[i];
	st[1]=1;
	dfs(1,1);
	cout<<ma;
}

T3小W来分组

错的点

在写代码时,gcd忘了,以后不能忘这种模版

思路

可以一个数字开始搜,再看其他数字能不能加入这个组,入组的数要标记,不能重复

代码

#include<bits/stdc++.h>
using namespace std;
long long n,a[111];
long long b[111],z;
long long gcd(int a,int b){
	if(!b)return a;
	return gcd(b,a%b);
}
void dfs(long long h){
	long long k=1;
	for(long long i=1;i<=n;i++){
		if(!b[i]){
			if(gcd(h,a[i])==1){
				b[i]=1;
				dfs(h*a[i]);
				k=0;
				break;
			}
		}
	}
	if(k){
		z++;
		return;
	}
}
int main(){
	freopen("fz.in","r",stdin);
	freopen("fz.out","w",stdout);
	cin>>n;
	for(long long i=1;i<=n;i++)cin>>a[i];
	for(long long i=1;i<=n;i++){
		if(!b[i]){
			b[i]=1;
			dfs(a[i]);
		}
	}
	cout<<z;
}

T4小W建围墙

思路

可以在外围再加一圈0,然后再对没被墙包起来的菜地进行洪水填充,最后统计包起来的菜地数

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,a[555][555],b[555][555],d=0,l=0;
int zx[10]={1,0,-1,0};
int zy[10]={0,1,0,-1};
void dfs(int i,int j){
	for(int h=0;h<4;h++){
		int x=i+zx[h];
		int y=j+zy[h];
		if(x>=0&&x<=n+1&&y>=0&&y<=m+1&&a[x][y]!=1&&!b[x][y]){
			b[x][y]=1;
			d++;
			dfs(x,y);
		}
	}
}
int main(){
	freopen("cd.in","r",stdin);
	freopen("cd.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char x;
			cin>>x;
			if(x=='*')a[i][j]=1,l++;
			else a[i][j]=0;
		}
	}
	b[0][0]=1;
	l++;
	dfs(0,0);
	cout<<((n+2)*(m+2))-l-d;
}

T5小W的密码

错的点

两个细节,一个计数,加了两次还有exit()里面要填0

思路

更第一题差不多,只多了元音辅音要处理

代码

#include<bits/stdc++.h>
using namespace std;
int l,c,g;
char a[1111],b[1111];
int d[1111];
void dfs(int w,int s,int y,int f){
	if(w>l){
		if(y>0&&f>1){
			g++;
			if(g>25000)exit(0);
			for(int i=1;i<=l;i++){
				cout<<b[i];
			}	
			cout<<"\n";		
		}
		return;
	}
	for(int i=s+1;i<=c;i++){
		if(!d[i]&&i!=0){
			d[i]=1;
			b[w]=a[i];
			if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')dfs(w+1,i,y+1,f);
			else dfs(w+1,i,y,f+1);		
			d[i]=0;
		}
	}
}
int main(){
	freopen("ss.in","r",stdin);
	freopen("ss.out","w",stdout);
	cin>>l>>c;
	for(int i=1;i<=c;i++)cin>>a[i];
	sort(a+1,a+1+c);
	dfs(1,0,0,0);
}