1.画图
问题描述
在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形,指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。
图片2.png
图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形 都涂成统一的颜色,图中显示不同颜色仅为说明方便。给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
输入说明
输入的第一行包含一个整数n,表示要画的矩形的个数,1<=n<=100
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。0<=横坐标、纵坐标<=100。
输出说明
输出一个整数,表示有多少个单位的面积被涂上颜色。
输入样例
2
1 1 4 4
2 3 6 5
输出样例
15
#include<iostream>
using namespace std;
int main()
{
int num[100][100] = { 0 }, n, i, j, k, sum, s[100][4];
//输入
cin >> n;
for (i = 0; i < n; i++)
{
for (j = 0; j < 4; j++)
cin >> s[i][j];
}
//上色,用1表示上色,之后可以相加来表示上色面积
for (i = 0; i < n; i++)
{
for (j = s[i][0]; j < s[i][2]; j++)
{
for (k = s[i][1]; k < s[i][3]; k++)
num[j][k] = 1;
}
}
//求面积
for (i = 0, sum = 0; i < 100; i++)
{
for (j = 0; j < 100; j++)
sum += num[i][j];
}
cout << sum << endl;
return 0;
}
2.矩阵相乘
描述
输入2×3矩阵A和3×2矩阵B各元素值,计算2×2矩阵C并输出其结果,矩阵相乘公式如下:Cmn=Amp*Bpn
输入说明
输入整形数据,如矩阵元素A={{1,2,3},{4,5,6}},B={{1,2},{3,4},{5,6}}。
输出说明
格式输出:输出矩阵A、B和A*B的结果,矩阵形式,分行分列输出,矩阵之间空一行。
提示
采用三重循环结构实现计算过程,数据输出格式%5d。
输入样例
1 2 3 4 5 6
1 2 3 4 5 6
输出样例
1 2 3
4 5 6
1 2
3 4
5 6
22 28
49 64
#include<iostream>
using namespace std;
int main()
{
int a[2][3]={0}, b[3][2]={0}, c[2][2]={0};
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
cin >> a[i][j];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 2; j++)
cin >> b[i][j];
**## *//矩阵相乘三重循环实现***
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
for (int p = 0; p < 3; p++)
{
c[i][j] += a[i][p] * b[p][j];
}
}
}
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
cout << b[i][j];
}
cout << endl;
}
cout << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
cout << c[i][j] << " ";
}
cout << endl;
}
return 0;
}
3.目录操作
问题描述
在操作系统中,文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。
有一个特殊的目录被称为根目录,是整个文件系统形成的这棵树的根节点,在类Linux系统中用一个单独的 “/”符号表示。
因此一个目录的绝对路径可以表示为“/d2/d3”这样的形式。
当前目录表示用户目前正在工作的目录。为了切换到文件系统中的某个目录,可以使用“cd”命令。
现在给出初始时的当前目录和一系列目录操作指令,请给出操作完成后的当前目录。
输入说明
第一行包含一个字符串,表示当前目录。
后续若干行,每行包含一个字符串,表示需要进行的目录切换命令。
最后一行为pwd命令,表示输出当前目录
注意:
所有目录的名字只包含小写字母和数字,cd命令和pwd命令也都是小写。最长目录长度不超过200个字符。
当前目录已经是根目录时,cd … 和cd /不会产生任何作用
输出说明
输出一个字符串,表示经过一系列目录操作后的当前目录
输入样例
/d2/d3/d7
cd …
cd /
cd /d1/d6
cd d4/d5
pwd
输出样例
/d1/d6/d4/d5
#include<iostream>
#include<string.h>
using namespace std;
void copy(char* n, char* m)
{
int i, j;
for (i = 3, j = 0; n[i] != '\0'; i++)
m[j++] = n[i];
m[j] = '\0';
}
//back要注意当前目录已经是根目录的情况
void back(char* n)
{
int i, index = 0;
//找到最后一个'/'
for (i = 0; n[i] != '\0'; i++)
{
if (n[i] == '/')
index = i;
}
if (index >= 1)//不是根目录,用'\0'截断原来的字符串
n[index] = '\0';
else
n[1] = '\0';
}
//relative还是要注意当前目录已经是根目录的情况
//不是的话还要自己加个'/'
void relative(char* n, char* m, int len_n, int len_m)
{
int i, j;
if (len_m > 1)
{
m[len_m] = '/';
for (i = 3, j = len_m + 1; i < len_n; i++)
m[j++] = n[i];
}
else
{
for (i = 3, j = len_m; i < len_n; i++)
m[j++] = n[i];
}
m[j] = '\0';
}
int main()
{
char cmd[200], dir[200];
void copy(char* n, char* m);
void back(char* n);
void relative(char* n, char* m, int len_n, int len_m);
gets_s(dir, 200);
gets_s(cmd, 200);
while (strcmp(cmd, "pwd"))
{
if (cmd[3] == '/')
copy(cmd, dir);
else if (cmd[3] == '.')
back(dir);
else
relative(cmd, dir, strlen(cmd), strlen(dir));
gets_s(cmd, 200);
}
puts(dir);
return 0;
}
4.字符串相似度
问题描述
最长公共子串指给定的两个字符串之间最长的相同子字符串(忽略大小写),最长公共子串长度可用来定义字符串相似度。
现给出两个字符串S1和S2,S1的长度为Len1,S2的长度为Len2,假设S1和S2的最长公共子串长度为LCS,则两个字符串的相似度定义为2
现给出两个字符串,请计算它们的相似度结果保留3位小数。
输入说明
输入为两行,分别表示两个字符串S1和S2,每个字符串长度不超过100个字符,所有字符均为可打印字符,包括大小写字母,标点符号和空格。
输出说明
输出两个字符串的相似度,结果四舍五入保留3位小数。
输入样例1
App
Apple
输出样例1
0.750
输入样例2
apple
pineapple
输出样例2
0.714
#include<iostream>
#include<string>
using namespace std;
int main()
{
char s1[100], s2[100];
int len1, len2;
float lcs, max = 0.0; //max表示最大长度
int a[100][100] = { 0 };
gets_s(s1);
gets_s(s2);
len1 = strlen(s1);
len2 = strlen(s2);
//递推动态规划
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
if (s1[i] == s2[j] || abs(s1[i] - s2[j]) == 32)
{
if (i != 0 && j != 0)
a[i][j] = a[i - 1][j - 1] + 1;
else
a[i][j] = 1;
}
}
}
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
//更新最大长度
if (a[i][j] > max)
max = a[i][j];
}
}
cout << max << endl;
lcs = 2 * max / (len1 + len2); //lcs公式
printf("%.3f", lcs); //C语言格式化输出
return 0;
}
5.字符串查找
问题描述
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入说明
输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。每个字符串长度不超过100。
输出说明
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。
输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
#include<iostream>
#include<ctype.h>
#include<string.h>
using namespace std;
int main()
{
char x[100], y[100][100];//二维字符数组
int n, m, i;
void lower(char* s);
cin >> x;
cin >> n >> m;;
for (i = 0; i < m; i++)
cin >> y[i];
//小写
if (n == 0)
{
lower(x);
for (i = 0; i < m; i++)
lower(y[i]);
}
for (i = 0; i < m; i++)
{
if (strstr(y[i], x))
puts(y[i]);
}
}
void lower(char* s)
{
char* p = s;
for (; *p != '\0'; p++)
*p = tolower(*p);
}