[Coursera C程序设计进阶] 期末考试

编程题#1:含k个3的数

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

输入二个正整数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

样例输入

 
 
1
43833 3

样例输出

 
 
1
YES
#include<iostream>
#include <cstdlib>
using namespace std;

int main() {
	int n, k;
	cin >> n >> k;
	int count = 0;
	if (n / 10000 == 3) count++; 
	if ((n%10000)/1000 == 3) count++;
	if (((n % 10000) % 1000) / 100 == 3) count++;
	if ((((n % 10000) % 1000) %100) / 10 == 3) count++;
	if (((((n % 10000) % 1000) % 100)%10) /1 == 3) count++;

	if (count == k&&n % 19 == 0) {
		cout << "YES" << endl;
	}
	else {
		cout << "NO" << endl;
	}




	return 0;



}

编程题#2:字符串中次数第2多的字母

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

输入一串长度不超过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多的字母总存在)

输入

一个字符串

输出

大写字母+小写字母:个数

样例输入

 
 
1
ab&dcAab&c9defgb

样例输出

 
 
1
D+d:2
#include<iostream>
#include <cstdlib>
#include <cstring>
#include <vector>
int n = 0;
using namespace std;
char* letter(char *str) {//过滤字母外的东西
	int i = 0, j = 0;
	static char newstr[500];
	char *p;
	char tmp;
	p = newstr;
	while (*(str + i) != '\0') {
		tmp = *(str + i);
		if ((tmp >= 'A' && tmp <= 'Z') || (tmp >= 'a' && tmp <= 'z')) {
			*(p + j) = tmp;
			j++;
			n++;
		}
		i++;
	}
	return newstr;
}
int k = 0;//出现的字母个数  

struct alpha {//用于保存出现的字母以及其个数  
	char letter;
	int time;
};
alpha strOut[500] = { '\0' };
int deal(char input) {//对于字母,进行处理,  
	bool find = false;
	for (int i = 0; i < k + 1; i++) {//出现过的字母,个数+1  
		if (input == strOut[i].letter) {
			find = true;
			strOut[i].time++;
			break;
		}
	}
	if (find == false) {//没出现过的字母,进行初始化,保存其字母,出现次数设定为1  
		strOut[k].letter = input;
		strOut[k].time = 1;
		k++;
	}
	return 0;
}
int main() {
	char str[500] = { '\0' };
	cin.getline(str, 500);
	int m = strlen(str);
	char *newstr;
	newstr = letter(str);
	for (int i = 0; i < m; i++) {
		if(newstr[i]>= 'A'&&newstr[i] <= 'Z') newstr[i] +=32;//转换大小写
	}

	for (int i = 0; i < 501; i++) {
		if (newstr[i] == '\0')
			break;
		else {
			deal(newstr[i]);
			}
		}
	
	

	
	alpha larggest = { ' ',0 };
	alpha second = { ' ',0 };
	for (int i = 0; i < k - 1; i++) {//通过最大值和次大值两个变量,最后找到次大值  
		if (strOut[i].time > larggest.time) {
			second = larggest;
			larggest = strOut[i];
		}
		else if (strOut[i].time > second.time&& strOut[i].time < larggest.time) {
			second = strOut[i];
		}
	}
	char temp = second.letter - 32;
	cout << temp << '+' << second.letter << ':' << second.time;


	return 0;



}

编程题#3:运算符判定

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

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

例如:

输入:

3,4,5

输出:

error

若输入:

3,4,3

则输出:

%

输入

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

输出

五个运算符之一或 error

样例输入

 
 
1
6,7,13

样例输出

 
 
1
+
#include<iostream>

using namespace std;


int main() {
	char slash1;
	char slash2;
	int a, b, c;
	cin >> a >>slash1>> b>>slash2 >> 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;
}

编程题#4:寻找平面上的极大点

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

在一个平面上,如果有两个点(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)

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

样例输入

 
 
1
2
5
1 2 2 2 3 1 2 3 1 4

样例输出

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

提示

#include<iostream>  
using namespace std;  
struct point {//用以记录每一个点  
    int x;//横坐标  
    int y;//纵坐标  
};  
int main() {  
    int n;  
    cin >> n;  
    point points[100];//从来接受所有的点  
    for (int i = 0; i < n; i++)   
        cin >> points[i].x >> points[i].y;  
    point maxs[100];//用来保存所有的极大点  
    int k = 0;  
    for (int i = 0; i < n; i++) {  
        bool max = true;//初始化这个点没有被支配  
        for (int j = 0; j < n; j++) {  
            if (j== i)  
                continue;  
            else if (((points[j].x >= points[i].x)&&(points[j].y >= points[i].y)) == true)//判断是否被支配,如果支配,则将max改为假  
                max = false;  
        }  
        if (max == true) {//把没有被支配的点保存下来  
            maxs[k] = points[i];  
            k++;  
        }  
    }  
    k--;//因为之前最后一次多了一个k++,所以这里-回来  
    for (int i = 0; i < k + 1; i++) {//排序  
        for (int j = i+1; j < k + 1; j++) {  
            if (maxs[i].x > maxs[j].x) {  
                point temp = maxs[i];  
                maxs[i] = maxs[j];  
                maxs[j] = temp;  
            }  
            else if (maxs[i].x == maxs[j].x&&maxs[i].y > maxs[j].y) {  
                point temp = maxs[i];  
                maxs[i] = maxs[j];  
                maxs[j] = temp;  
            }  
        }  
    }  
    for (int i = 0; i < k+1 ; i++) {//输出,最后一次没有,  
        cout << '(' << maxs[i].x << ',' << maxs[i].y << ')';  
        if (i == k)  
            cout << endl;  
        else  
            cout << ',';  
    }  
    return 0;  
}  

WA but with right output:

#include<iostream>
#include <vector>  
#include <iomanip> 
using namespace std;

typedef struct coord
{
	int x;
	int y;
	int flag;
};

int main() {
	int n;
	cin >> n;
	int save[200] = {0};
	vector<coord> d(n);
	for (int i = 0; i < 2*n; i++) {
		cin >> save[i];
	}
	for (int i = 0; i <  n; i++) {
		d[i].x = save[2*i];
		d[i].y = save[2 * i + 1];
	}
	for (int i = 0; i < n; i++) {
		int count = 0;
		
		for (int j = 0; j < n; j++) {
			if (d[i].x > d[j].x || d[i].y > d[j].y)count++;
				
		}
		if (count==n-1)d[i].flag = 1;
	}

	for (int i = 0; i < n - 1; i++) {
		for (int j = 1; j < n - i; j++) {
			if (d[j - 1].x > d[j].x) {
				int temp = d[j].x;
				d[j].x = d[j - 1].x;
				d[j - 1].x = temp;
				int temp1 = d[j].y;
				d[j].y = d[j - 1].y;
				d[j - 1].y = temp1;
				int temp2 = d[j].flag;
				d[j].flag = d[j - 1].flag;
				d[j - 1].flag = temp2;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		if (d[i].flag == 1) {
			cout << '(' << d[i].x << ',' << d[i].y << ')';
			if (i == n-1)
				cout << endl;
			else
				cout << ',';
		}
	}
	
	system("pause");
	return 0;
}

编程题#5:走出迷宫

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

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

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

输入

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

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

输出

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

参考答案:

#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
    already[startx][starty]=0;
    cross(startx,starty,endx,endy);
    cout <<min_count<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_30945147/article/details/80740215