C/C++ (12月第二周)

 

第一题:含k个3的数

输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。 
例如,输入: 
43833 3 
满足条件,输出YES。
如果输入:
39331 3 
尽管有3个3,但不能被19整除,也不满足条件,应输出NO。

输入

m 和 k 的值,中间用单个空格间隔。

输出

满足条件时输出 YES,不满足时输出 NO。

样例输入

43833 3

样例输出

YES

第二题:字符串中次数第2多的字母

描述 
输入一串长度不超过500个符号的字符串,输出在串中出现第2多的英语字母(大小写字母认为相同)和次数(如果串中有其它符号,则忽略不考虑)。如果有多个字母的次数都是第2多,则按串中字母出现的顺序输出第1个。 
例:ab&dcAab&c9defgb。这里,a 和 b都出现3次,c和d都出现2次,e、f 和 g 各出现1次,其中的符号&和9均忽略不考虑。因此,出现第2多的应该是 c 和 d,但是 d 开始出现的位置在 c 的前面,因此,输出为D+d:2。(假定在字符串中,次数第2多的字母总存在) 
输入 
一个字符串 
输出 
大写字母+小写字母:个数 
样例输入 
ab&dcAab&c9defgb 
样例输出 
D+d:2 

第三题:运算符判定 

两个整数 a 和 b 运算后得到结果 c。表示为:a ? b = c,其中,?可能是加法 +,减法 -,乘法 *,整除 / 或 取余 %。请根据输入的 a,b,c 的值,确定运算符。如果某种运算成立,则输出相应的运算符,如果任何运算都不成立,则输出 error.

例如:

输入:

3,4,5

输出:

error

若输入:

3,4,3

则输出:

%

输入

a b和 c 的值在意行内输入,以逗号间隔

输出

五个运算符之一或 error

样例输

6,7,13

样例输出

+

 

第四题

在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b;

用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。

给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。

编程找出所有的极大点,按照x座标由小到大,输出极大点的座标。

本题规定:n不超过100,并且不考虑点的座标为负数的情况。

输入

输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的座标,座标值都是整数,座标范围从0到100,输入数据中不存在座标相同的点。

输出

按x轴座标最小到大的顺序输出所有极大点。

输出格式为:(x1,y1),(x2,y2),...(xk,yk)

注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错

样例输入

5

1 2 2 2 3 1 2 3 1 4

样例输出

(1,4),(2,3),(3,1)

 

第五题:走出迷宫

描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入

第一行是两个整数n和m(1 <= n,m <= 100),表示迷宫的行数和列数。

接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。

 

输出

输出从起点到出口最少需要走的步数。(你不能起出迷宫外)

样例输入

3 3

S#T

.#.

...

样例输出

6

 

 

 

第一题题解:

#include<iostream>
using namespace std;
int main(){
   int m,k,temp,flag=0;
   cin >> m >> k;
   temp = m;
   while(temp > 0){
    if (temp %10 ==3) ++flag;
    temp /=10;
   }
   if(m%19 == 0 && flag == k)
    cout << "YES"<< endl;
   else
    cout<<"NO"<< endl;
   return 0;
}

第二题解:初步思路首先用一个字符数组a[]装输入,   然后把 大小写字母归为一类,用一个字符数组coun[]计数.然后遍历这个数组求出第二大出现次数的字母(本文采用的方法是求出出现次数最多的字母,把它变成零,再求最多出现次数的字母,此时就是第二出现次数的字母),最后在a[]里找到最先出现的第二大字母,就可以了

#include<iostream>
using namespace std;
int main(){
    char a[500];
    int coun[26] = {0};
    cin >> a;
    for(int i = 0;a[i] != '\0';++i){
        if(a[i] >=65 && a[i] <=90 )
            ++coun[a[i]-65];
        else if(a[i] >=97 && a[i] <= 122 ){
            ++coun[a[i] -97];
            a[i] -= 32;
        }
    }
    int fmax=0,smax=0;
    for(int i=0; i<26; ++i)
        if(coun[fmax] <= coun[i])
            fmax = i;

    for(int i=0; i<26; ++i)
        if(coun[i] == coun[fmax])
            coun[i] = 0;

    for(int i =0; i<26; ++i)
        if(coun[smax] <= coun[i])
            smax=i;

    int num = coun[smax];
    for(int i =0; a[i] != '\0';++i){
        if(coun[a[i] -65] == num)
            {cout << char(a[i])<< "+" << char(a[i]+32) << ":"<< num<<endl;break;}
    }
    return 0;
}

第三题解:5个判断就行了

#include<iostream>
using namespace std;
int main(){
    int a,b,c;
    char commom;
    cin >> a >> commom >> b >> commom >> c;
    if(a+b == c)
        cout << "+" << endl;
    else if(a-b == c)
        cout << "-" << endl;
    else if(a*b == c)
        cout << "+" << endl;
    else if(a/b == c)
        cout << "/" << endl;
    else if(a%b == c)
        cout << "%" << endl;
    else
        cout << "error" << endl;
    return 0;
}

 

第四题解:使用结构体定义比较方便,也可以使用二维数组,不过在代码上比较长而已

思路流程如下:定义结构体——输入——找极大值(用两个循环即可)——对极大值进行排序——输出

#include<iostream>
using namespace std;
struct student{
    int x;
    int y;
}; // we use struct to definition
int main(){
    int n ;
    cin >> n;
    student point[100];
    for(int i=0; i<n; ++i)
        cin >> point[i].x >>point[i].y;  //input data
    student maxs[100];  // store maxima 
    int a=0;//store the number of maxima
    for(int i=0; i<n; ++i){   // find maxima 
        bool flag = true;
        for(int j=0; j<n; ++j){
            if(j == i)
                continue;
            else if(((point[j].x >= point[i].x)&&(point[j].y >= point[i].y)) == true)
                {flag = false;break;}
        }
        if (flag == true)
             maxs[a++] = point[i];
    }
    
    for(int i=0; i<a; ++i){     // using  bubble Sorting algorithm
        for(int j=0; j<a-i-1; ++j){
            if(maxs[j].x > maxs[j+1].x || maxs[j].x==maxs[j+1].x && maxs[j].y > maxs[j+1].y){
                student temp = maxs[j];
                maxs[j] = maxs[j+1];
                maxs[j+1] = temp;
            }
        }
    }
    for(int i=0;i<a;++i){   // input maxima
        cout <<'(' << maxs[i].x << ',' << maxs[i].y <<')';
        if(i==a-1)
            cout << endl;
        else
            cout << ',';
    }
    return 0;

}

 第五题题解:参考网上的源代码。这题用了一个递归函数求解,算法采用的是广度优先搜素算法,memset函数是一个功能性函数,具体可谷歌。在本题的作用是把数组所有的值赋值为一个很大的数。

#include <iostream>
#include <cstring>
using namespace std;

int m,n;//n行m列
char map[101][101];//地图矩阵
int already[101][101];//已走地图记忆
int min_count=0;

void cross(int u, int v, int i, int j)
{
    int t = already[u][v];
    if (u == i && v == j)//起点即为到达终点
    {
        min_count = t;
    }
    t++;

    if (v < m - 1 && map[u][v+1] != '#'  && already[u][v+1]>t)//在迷宫内、右侧非墙且此点没有走过
    {
        already[u][v+1] = t;//标记此点为第t步
        cross(u, v+1, i, j);//以此点为起点继续走
    }
    if (u > 0 && map[u-1][v] != '#'  && already[u-1][v]>t)
    {
        already[u-1][v] = t;
        cross(u-1, v, i, j);
    }
    if (v > 0 && map[u][v-1] != '#'  && already[u][v-1]>t)
    {
        already[u][v-1] = t;
        cross(u, v-1, i, j);
    }
    if (u < n - 1 && map[u+1][v] != '#' && already[u+1][v]>t)
    {
        already[u+1][v] = t;
        cross(u+1, v, i, j);
    }
}

int main() {
    int startx,starty,endx,endy;
    cin >> n >> m ;
    for (int i=0; i<n ; i++) {
        for (int j=0; j<m; j++) {
            cin >> map[i][j];
            if (map[i][j]=='S') {
                startx=i;
                starty=j;
            }
            if (map[i][j]=='T') {
                endx=i;
                endy=j;
            }
        }
    }
    memset(already,1,sizeof(already));//按字节为单位赋值:16843309   即把所有数组值赋为16843309
    already[startx][starty]=0;
    cross(startx,starty,endx,endy);
    cout <<min_count<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章