17HNUCM计科练习15题解(n皇后,图着色,素数环)

目录

Welcome 

 解密

ly的仓鼠

N皇后

素数环

图的m着色问题


Welcome 

题目描述

”How happy we are, To meet friends from afar!”
Welcome to Hunan University of Chinese Medicine!
Hope all of you can enjoy the competition ^ v ^
Now your task is to read an integer w and output the character painting of ”HNUCM”, there are w
space(s) (space are represented by dot) between two letters. Please refer to the sample for the specific
format.

输入

There are several test files and each contains one case.
The input contains only 1 integer w (1 ≤ w ≤ 2018).

输出

The output has 5 lines, each line has 25+4w characters which only contains ’o’(lowercase letter ’o’) and
’.’(English period ’.’)

样例输入 Copy

1

样例输出 Copy

o...o.o...o.o...o.ooooo.o...o
o...o.oo..o.o...o.o.....oo.oo
ooooo.o.o.o.o...o.o.....o.o.o
o...o.o..oo.o...o.o.....o...o
o...o.o...o.ooooo.ooooo.o...o
//水题,输出HNUCM就行了,中间用n个'.'隔开就行
#include<bits/stdc++.h>
using namespace std;
char a[5][30]={"o...oo...oo...ooooooo...o","o...ooo..oo...oo....oo.oo","oooooo.o.oo...oo....o.o.o","o...oo..ooo...oo....o...o","o...oo...oooooooooooo...o"};
int main(){
    int n,i,j;
    while(cin>>n){
        for(i=0;i<5;++i){
            for(j=0;j<25;j++){
                printf("%c",a[i][j]);
                if(j%5==4&&j!=24)
                    for(int k=0;k<n;++k){
                        putchar('.');
                    }
            }
            cout<<endl;
        }
    }
	return 0;
}

 解密

题目描述

湖南中医药大学有含浦、东塘 2 个校区,学校办学历史悠久,前身为 1934 年的湖南国医专科学校,1953
年创办湖南中医进修学校,1960 年创建普通高等本科院校——湖南中医学院,1979 年成为全国首批取得
中医类研究生学历教育资格的院校,1990 年原湖南科技大学成建制并入湖南中医学院,2002 年与湖南省
中医药研究院合并,2006 年经教育部批准更名为湖南中医药大学,2012 年进入湖南省一本招生序列。
目前,学校与湖南省中医药研究院实行校院合一的管理体制。学校学科门类齐全、中医药特色鲜明。学校
设有 18 个学院、24 个本科专业,涵盖医、理、工、管、文等 5 大学科门类。中医诊断学在本学科研究领
域居国内领先水平。
小 F 居住在含浦校区,他想和东塘校区的同学小 L 聊天,为了保证沟通安全,他发明了一种加密方式,这
种加密方式是这样的:对于一个 01 串,小 F 会将其从左到右每 8 位分成一组,最后一组可能不足 8 位,
对每组进行逆序操作,即如果原来是 bLbL+1bL+2 · · · bR−1bR, 逆序之后变成 bRbR−1bR−2 · · · bL−1bL。现在
小 F 已经加密好了一个串,并且将其发给了小 L,你能帮助小 L 得到这串密文对应的原始信息吗?

输入

单组数据。
一行一个 01 串,代表加密后的字符串,串长度大于 0, 小于等于 100。

输出

一行字符串,代表加密后的字符串所对应的原始信。

样例输入 Copy

100010110011101

样例输出 Copy

110100011011100
#include<bits/stdc++.h>
using namespace std;
string s;//8 9 10 11 12 13 14 15
void solve(int x,int y){
    int dis=y-x;
    int i;
    for(i=x;i<x+dis/2;++i){
        swap(s[i],s[y-i-1+x]);
    }
}
int main(){
    int n,i,j;
    while(cin>>s){
        int len=s.length();
        n=len/8;
        for(i=0;i<n;++i){
            solve(i*8,(i+1)*8);
        }
        solve(n*8,len);
        cout<<s<<endl;
    }
	return 0;
}

ly的仓鼠

题目描述

上完体育课的ly很无聊,于是准备去蹭一蹭临床专业的课程,正好今天他们准备研究一些仓鼠的基因,由于操作有点出错...ly得到了一段很长很长的基因链(都是由小写字母构成),作为一个好奇心极强的人,ly有了一个问题,每次取两个区间,用这两个区间的DNA生产出来的仓鼠,会是两只一模一样的仓鼠吗?
显然小胖子ly光有好奇心并没有那个能力去得出结果...只会提问不会解答,所以又要麻烦你帮她了。

输入

第一行输入两个正整数n,q,分别代表DNA串的长度以及要询问的次数。
第二行一个字符串S,表示ly得到的DNA序列
下面q行每行输入四个整数l1,r1,l2,r2分别代表q次询问,对于每一次询问请你判断两个[l,r]区间的DNA是否相同。

输出

对于每一个询问 相同输出YES不相同输出NO
数据量较大,建议使用scanf,printf输入输出

样例输入 Copy

10 5
abcaabasda
1 3 2 4
4 4 5 5
1 2 5 6
1 5 6 10
1 9 2 10


样例输出 Copy

NO
YES
YES
NO
NO

提示

输入数据保证:1<=length(S),q<=1000000

#include<bits/stdc++.h>
using namespace std;
string s;
void solve(int l1,int r1,int l2,int r2){
    int i,j;
    for(i=l1-1,j=l2-1;i<r1,j<r2;++i,++j){
        if(s[i]!=s[j])
        {
            printf("NO\n");
            return;
        }
    }
    printf("YES\n");
}
int main(){
    int n,i,j;
    int m;
    while(~scanf("%d %d",&n,&m)){
        cin>>s;
        int l1,r1,l2,r2;
        string s1,s2;
        for(i=0;i<m;++i){
            scanf("%d %d %d %d",&l1,&r1,&l2,&r2);
            if(r1-l1!=r2-l2)
            {
                printf("NO\n");
                break;
            }
            solve(l1,r1,l2,r2);
        }
    }
	return 0;
}

 

N皇后

题目描述

使用回溯法求解N后问题

 

输入

皇后的个数

输出

每一种方案及总方案数

样例输入 Copy

4

样例输出 Copy

0 1 0 0
0 0 0 2
3 0 0 0
0 0 4 0
----------------
0 0 1 0
2 0 0 0
0 0 0 3
0 4 0 0
----------------
总方案数为:2
#include<bits/stdc++.h>
using namespace std;
int n;
int ans;
int a[105];
void print(int n){
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            if(a[i]==j)
                cout<<i;
            else
                cout<<0;
            cout<<" ";
        }
        cout<<endl;
    }
    cout<<"----------------"<<endl;
}
int check(int x,int y){
    int i=1;
	while(i<y){//皇后的行数r一定要大于i
		if (x==a[i]||abs(y-i)==abs(x-a[i])) {
			return 0;
		}
		++i;
	}
	return 1;
}
void solve(int m){
    int i;
	for (i=1;i<=n;i++) {
		a[m]=i;
		if (check(i,m)){
			if(m==n){
				print(n);
				++ans;
			}
			else{
				solve(m+1);
			}
		}
	}
}
int main(){
    int i;
    while(cin>>n){
        memset(a,0,sizeof(a));
        ans=0;
        solve(1);
        cout<<"总方案数为:"<<ans<<endl;
    }
	return 0;
}

 

素数环

题目描述

现有1,2,3...,n,要求用这些数组成一个环,使得相邻的两个整数之和均为素数,要求你求出这些可能的环。

输入

输入正整数n

输出

输出时从整数1开始逆时针输出,同一个环只输出一次,且满足条件的环应按照字典序从小到大输出。

样例输入 Copy

6

样例输出 Copy

1 4 3 2 5 6
1 6 5 2 3 4
#include<bits/stdc++.h>
using namespace std;
int vis[105];
int prime[105];
int n;
void print(int m){
    for(int i=1;i<=n;++i){
        cout<<prime[i];
        if(i==m)
            cout<<endl;
        else
            cout<<" ";
    }
}
int isprime(int m)
{
    int flag;
    if(m<2)
        return 0;
    for(int i=2;i<=sqrt(m);++i){
        if(m%i==0)
            return 0;
    }
    return 1;
}
void dfs(int m)
{
    if(m==n&&isprime(prime[m]+prime[1])){
        print(m);
        return;
    }
    for(int i=2;i<=n;i++){
        if(!vis[i]&&isprime(prime[m]+i))
        {
            vis[i]=1;
            prime[m+1]=i;
            dfs(m+1);
            vis[i]=0;
        }
    }
}
int main()
{
    int cased=1;
    while(cin>>n)
    {
        memset(prime,0,sizeof(prime));
        memset(vis,0,sizeof(vis));
        prime[1]=1;
        if(n%2==0)//只有奇数有素数环
            dfs(1);
    }
    return 0;
}

 

图的m着色问题

题目描述

 给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,请输出着色方案。

输入

输入第一行包含n,m,k分别代表n个结点,m条边,k种颜色,接下来m行每行有2个数u,v表示u和v之间有一条无向边,可能出现自环边,所以请忽略自环边。

输出

输出所有不同的着色方案,且按照字典序从小到大输出方案。

样例输入 Copy

3 3 3
1 2
1 3
2 3

样例输出 Copy

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<bits/stdc++.h>
using namespace std;

int n,k,m;
int s;
int mapp[100][100],color[100];

int check(int t,int i)
{
    int j;
    for(j=1;j<t;j++)
    {
        if(mapp[t][j]&&color[j]==i)
            return 0;
    }
    return 1;
}
void backk(int t,int m)
{
    int i;
    if(t>n)
    {
        s++;
        for(i=1;i<=n;i++)
            cout<<color[i]<<" ";
        cout<<endl;
    }
    else
    {
        for(i=1;i<=m;i++)
        {
            if(check(t,i))
            {
                color[t]=i;
                backk(t+1,m);
            }
        }
    }
}

int main()
{
   while(cin>>n>>k>>m)
   {
       memset(color,0,sizeof(color));
       s=0;
       int i,a,b;
       for(i=1;i<=k;i++)
       {
           cin>>a>>b;
           mapp[a][b]=1;
           mapp[b][a]=1;
       }
       backk(1,m);
   }
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值