小W选数字

思路:爆搜

纯深搜

代码

#include<bits/stdc++.h>
using namespace std;
int n,r;
vector<int> a;
void f(int i,int j){
//	cout<<i<<","<<j<<","<<n-(i+1)+1<<","<<endl;
	if(j>r){
		for(int op=0;op<a.size();op++){
			cout<<"  "<<a[op];
		}
		cout<<endl;
		return ;
	}
	a.push_back(i);
	for(int q=i+1;min(r-j+1,n-q+2)!=0;q++){
		f(q,j+1);
		if(j!=r){
			a.pop_back();
		}else{
			return ;
		}
	}
}
int main(){
	freopen("xsz.in","r",stdin);
	freopen("xsz.out","w",stdout);
	cin>>n>>r;
	for(int i=1;i<=n-r+1;i++){
		f(i,1);
		a.pop_back();
	}
	return 0;
}

小W玩接龙1

思路

由于爆搜能过,所以每次都有过和不过,而我们可以用一个标记数组,来标记是否用过(因为这题不按顺序)。as来保存已经选了哪些数,最后保留最大值

代码

#include<bits/stdc++.h>
using namespace std;
string a[60];
bool st[60];
vector<string> as;
int ans=0,n;
void dfs(char ab){
	for(int i=2;i<=n;i++){
		ans=max(ans,(int)as.size());
		if(ab==a[i][0]&&st[i]==0){
			st[i]=1;
			as.push_back(a[i]);
			dfs(a[i][1]);
			as.pop_back();
			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>>a[i];
	}
	dfs(a[1][1]);
	cout<<ans+1;
	return 0;
}

小W来分组

思路

1.爆搜

将所有情况枚举一遍。

2.优化

我们先知道:

  1. 如果c与aXb互质,那么c与a,都互质

那么我们就可以将两个数列出来,然后将一个数乘上另一个数,再将另一个数设为零。

再统计不是0的数量就可以了

代码

#include<bits/stdc++.h>
using namespace std;
int a[20],n,op;
bool st[20];
int ans=0;
int fa(int dg,int cg){
	if(cg==0){
		return dg;
	}else{
		return fa(cg,dg%cg);
	}
}
void dfs(int l){
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if((a[i]!=0||a[j]!=0)&&fa(a[i],a[j])==1){
				a[i]*=a[j];
				a[j]=0;
			}
		}
	}
}
int main(){
	freopen("fz.in","r",stdin);
	freopen("fz.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(1);
	for(int i=1;i<=n;i++){
		if(a[i]!=0){
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

小W建围墙

思路

包围起来的肯定不与外界进行交接,那么就可以用洪水填充来解决。

那么怎么判断是否为外面呢?山羊是从边缘出来的,所以我们可以从边缘填充

代码

#include<bits/stdc++.h>
using namespace std;
char a[510][510];
int xd[]={0,1,0,-1},xy[]={1,0,-1,0},n,m;
void dfs(int x,int y){
	if(a[x][y]=='*'){
		return ;
	}
	a[x][y]='*';
	for(int i=0;i<4;i++){
		int nx=x+xd[i],ny=y+xy[i];
		if(nx<1||ny<1||nx>n||ny>m||a[nx][ny]=='*'){
			continue;
		}
		dfs(nx,ny);
	}
}
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++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		dfs(i,1);
		dfs(i,m);
	}
	for(int i=1;i<=m;i++){
		dfs(1,i);
		dfs(n,i);
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='0'){
				ans+=1;
			}
		}
	}
	cout<<ans;
	return 0;
}