T1T1

考试错误:无。

思路:

全组合问题,直接暴搜就行了。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int flag[70],cnt,n,r;
void dfs(int u){
    if(cnt==r){
        cout << "  ";
        for(int i=1;i<=n;i++){
            if(flag[i]) cout << i << "  ";
        }
        cout << endl;
        return;
    }
    if(u>n){
        return;
    }
    flag[u]=1;
    cnt++;
    dfs(u+1);
    cnt--;
    flag[u]=0;
    dfs(u+1);
}
signed main(){
    freopen("xsz.in","r",stdin);
	freopen("xsz.out","w",stdout);
    cin >> n >> r;
    dfs(1);
}

T2T2

考试错误:在考试时以为只能往后接,没有考虑到往前接的情况,导致扣了8080分。

思路:

同样是暴搜,枚举所有情况即可。

代码:

#include <bits/stdc++.h>
using namespace std;
char s[80][2];
int vis[80];
int n,ans=-1;
void dfs(int u,int lg){
	ans=max(ans,lg);
	for(int i=1;i<=n;i++){
  		if(i==u||s[u]==s[i]) continue;
  		if(s[u][1]==s[i][0]&&!vis[i]){
  			vis[i]=1;
  			dfs(i,lg+1);
  			vis[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][0] >> s[i][1];
  	}
	vis[1]=1;
  	dfs(1,1);
  	cout << ans;
}

T3T3

考试错误,没做这题,无。

思路:

11.这里要用到亿点数学知识:如果一个数ccabab互质,那么这个数一定分别与aabb互质。

22.这样我们就可以用数字的乘积来代替组了。

33.最后输出不为零的数字的个数。

代码:

#include <bits/stdc++.h>
using namespace std;
int a[15];
int n;
void dfs(){
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(__gcd(a[i],a[j])==1&&a[i]!=0&&a[j]!=0){
                a[i]*=a[j];
                a[j]=0;
                dfs();
            }
        }
    }
}
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();
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(a[i]) cnt++;
    }
    cout << cnt;
}

T4T4

考试错误:无。

思路:

标准的洪水填充,思路略。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=550;
int a[N][N];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int n,m;
void dfs(int x,int y){
    a[x][y]=0;
    for(int i=0;i<4;i++){
        int nx=x+dx[i],ny=y+dy[i];
        if(nx<1||nx>n||ny<1||ny>m) continue;
        if(a[nx][ny]==0) continue;
        a[nx][ny]=0;
        dfs(nx,ny);
    }
    return;
}
signed 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 c;
            cin >> c;
            if(c=='0') a[i][j]=1;
        }
    }for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if((i==1||i==n||j==1||j==m)&&a[i][j]==1){
                dfs(i,j);
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            ans+=a[i][j];
        }
    }
    cout << ans;
}

T5T5

考试错误:没做出来。

思路:

和第一题没有区别,顶多注意元辅音就可以了。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int flag[111],cnt,c,l;
char s[111];
void dfs(int u,int now,int y,int f){
    if(u>l){
        if(y>=1&&f>=2){ 
            cnt++;
             if(cnt>25000) exit(0);
            for(int i=1;i<=c;i++){
                if(flag[s[i]]) cout << s[i];
            }
           
            cout << endl;
           
        }
        return;
    }
    for(int i=now+1;i<=c;i++){
        if(!flag[s[i]]){
            flag[s[i]]=1;
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u'){
                y++;
                dfs(u+1,i,y,f);
                y--;
            }else{
               f++;
               dfs(u+1,i,y,f);
               f--; 
            }
            flag[s[i]]=0;
        }
    }
}
signed main(){
    freopen("ss.in","r",stdin);
	freopen("ss.out","w",stdout);
    cin >> l >> c;
    for(int i=1;i<=c;i++){
        cin >> s[i];
    }
    sort(s+1,s+c+1);
    dfs(1,0,0,0);
}