- 张家宁 的博客
DAY12
- @ 2024-7-22 20:43:57
小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.优化
我们先知道:
- 如果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;
}