题目来源:西工大计算机(微信公众号)
字符串匹配解决方法和连阴雨参考该篇博客
六数码和真值表问题来自该篇博客
第一题:求三个数中最小的一个
输入样例:5 3 98
输出样例:3
#include<iostream>
using namespace std;
int min1(int n1, int n2, int n3)
{
if (n1 < n2)
{
if (n1 < n3)
return n1;
else
return n3;
}
else
{
if (n2 > n3)
return n3;
else
return n2;
}
}
int main()
{
int a, b, c;
cout << "Please input:";
cin >> a >> b >> c;
cout << min1(a, b, c) << endl;
return 0;
}
第二题:十进制转化为二进制
输入样例:1030
输出样例:10000000110
实际中解决问题时,十进制转换为二进制是通过长除法来实现,本次数制转换也可以通过这种思想,编程解决实际问题。
长除法10进制转换为2进制是将余数写在一侧,商写在底下,计算结束后将余数逆写便为转换而成的目标字符串。递归调用刚好有这一特性,递归结束后,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
void convto(char c[], int n1, int n2)//进制转换函数,n1为待转换数,n2为目标进制,将n1转化为n2进制的数据
{
int len; //转换而成的字符串长度;
char bit[] = { "0123456789ABCDEF" };//最大可转换为16位;
if (n1 == 0) //0转化为空
{
strcpy(c, "");
return;
}
convto(c, n1 / n2, n2); //递归,递归结束之后,逆调用方向输出下列语句;
len = strlen(c);
c[len] = bit[n1 % n2]; //bit对应位和目标字符串一一对应
c[len + 1] = '\0';
}
int main()
{
char c[20] = {}; //c用来保存转换而成的字符串
int number;
cin >> number; //输入待转换数字
convto(c, number, 2);//调用进制转换子函数
cout << c<<endl;
return 0;
}
第三题:迷宫问题1
思想:刚开始不太明白题目中的迷宫是如何设置的,是什么样式,题目是什么意思?参考别人答案之后意识到迷宫就是n*n的正方形,n为输入的行数;最框是迷宫的边边界,无法行进,在内部是可以自由行走的。根据题目输入样例可以看出,每次输入都是一个值,简单的开关语句便可以实现。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n; //n代表输入行数,2 <= n <= 20;
int m, t; //坐标位置,行数、列数都从0开始;
char str; //代表行走的方向;
cin >> t;
cin >> n >> m;
cin >> str;
if (str == 'w') //向上走;
{
if (n == 0) //位于第一行时,边界,无法向上行走,其余方向均可;
printf("N\n");
else
printf("Y\n");
}
else if (str == 's') //向下走;
{
if (n == t - 1) //最后一行不能向下走,其余方向均可行走;
printf("N\n");
else
printf("Y\n");
}
else if (str == 'a') //向左走;
{
if (m == 0) //第一列不可向左走;
printf("N\n");
else
printf("Y\n");
}
else if (str == 'd') //向右走;
{
if (m == t - 1) //最后一列不能向右走;
printf("N\n");
else
printf("Y\n");
}
return 0;
}
第四题:迷宫问题2
思想:这道题目比上一题有所改进,上一题迷宫内部可自由行走,边界无法前进;而本题人为输入数据矩阵,矩阵对应迷宫大小,在迷宫内部人为设置障碍。解决方法是在上题基础之上添加判断,上题是根据输入的方向进行判断,行进方向若为边界则不能前进;而本题四个方向都得判断,也就是每次还得判断前进方向是否有障碍。
#include<iostream>
#include<cstring>
using namespace std;
int num[100][100];
bool judge(int n, int n1, int n2, char location)
{
switch (location)
{
case '0'://A 除了判断是否为边界之外,还要判断前进方向是否有障碍
if (n2 == 0) //判断是否为边界
return false;
else //不为边界,判断前进方向是否有障碍
{
n2 = n2 - 1;
if (num[n1][n2] == 0)
{
return true;
}
else
{
return false;
}
}
break;
case '1'://S
if (n1 == n - 1)
return false;
else
{
n1 = n1 + 1;
if (num[n1][n2] == 0)
return true;
else
return false;
}
break;
case '2'://D
if (n2 == n - 1)
return false;
else
{
n2 = n2 + 1;
if (num[n1][n2] == 0)
return true;
else
return false;
}
break;
case '3'://W
if (n1 == 0)
return false;
else
{
n1 = n1 - 1;
if (num[n1][n2] == 0)
return true;
else
return false;
}
break;
}
return true;
}
int main()
{
int n; //n代表输入行数,2 <= n <= 20;
int x, y; //坐标位置,行数、列数都从0开始;
char str; //代表行走的方向;
cin >> n;
cout << "please input 0 or 1" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> num[i][j];//输入矩阵,人为设置障碍
}
}
cin >> x >> y;
cin >> str;
if (judge(n,x, y, str))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
第五题:字符串替换
思想:该题直接实现比较困难,包含字符串匹配算法,但该篇博客使用find函数和replace函数进行快速解决。若为机器测试,则方便快捷;但若人工阅卷,有投机取巧之嫌。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a[3]; //3个目标数组
for (int i = 0; i < 3; i++)
{
getline(cin, a[i]);//从键盘读入字符数据流
}
int pos = a[0].find(a[1]);//find函数,找到第二个字符数组在第一个字符数组中的起始位置
a[0].replace(pos, a[1].length(), a[2]);//替换, 用str替换指定字符串从起始位置pos开始长度为len的字符
//string& replace(size_t pos, size_t len, const string& str);
cout << a[0] << endl;
return 1;
}
第六题:六数码问题
这道题目不会,可参考该篇博客
第七题:输出命题公式的真值表
不会,可参考该篇博客。
第八题:计算单词的个数
思想:建立一个字符数组,从键盘读入字符串,对该字符数组逐位进行判断,某一位有字符且下一位为空,则为一个单词;但要设置对最后一个单词的判断,即该位不为空,下一位为结束符,否则很容易导致最后一个单词没有算上。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
int judge(char c[ ])
{
int count = 0,len,j;
//len = sizeof(s); //str.length()、str.size()、sizeof(str)都可以求字符串长度。
len = strlen(c); //strlen()用来求字符数组个数
for (int i = 0; i < len; i++)
{
j = i + 1;
if (c[i] != ' ' && c[j] == ' ') //第一种情况,该位不为空,而下一位为空,则单词计数器加1;
count++;
else if (c[i] != ' ' && c[j] == '\0')// 第二种情况,该位不为空,而下一位为结束符,意为最后一个单词,加1;
count++;
else
continue;
}
return count;
}
int main()
{
char s[80] = {};
cout << "Please input one sentence:" << endl;
//getline(cin, s); //一般用作键盘读取字符串输入
cin.getline(s, 80);
cout << judge(s) << endl;
return 0;
}
当然也可以加一个字符判断数组,确定其只能为大小写字母。
第九题:连阴雨