- chenshixian 的博客
陈室先的总结7.22day12
- @ 2024-7-22 17:41:05
题目传送门
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);
}