1、笨笨熊搬家交通篇
/*
森林里的苯苯熊要乔迁新喜,上次他已经将物品打包完成,并约了朋友来帮忙。接下来他要选定一个搬家的时间,想了很久,就决定在国庆节进行,因为国庆放假朋友们都有时间啦。
但是在森林里,从他现在房子到新豪宅,所经之地有山有水,路途曲折,甚至有些道路是不通的。
请你和他一起查看指定的地图,看看从笨笨熊现在的房子到新宅之间,道路是否是畅通的呢?
地图是R行、C列的矩阵,矩阵的每一个格子刚好是一天的行程。
矩阵由“B”、“-”、“#”、“H”四种字符成员组成,其中:
B: 代表苯苯熊现在的房子;
H: 代表笨笨熊新的豪宅;
-: 代表可以通行的道路;
#: 代表无法通过的障碍(高山、大河等);
此外,森林里也有交通规则地:在任务位置,只能向“上、下、左、右”四个方向中的其中一个方向行走.
运行时间限制:无限制
内存限制:无限制
输入:
4 // R的数值
4 // C的数值,下面是地图。
--##---
B-----H
#---#--
-------
输出:
Y //代表道路可达
或
N //代表道路不通
样例输入:
15-B-H#
样例输出:
Y
*/
#include <iostream>
using namespace std;
void search(char **map, int **num,int r, int c);
int R, C;
//struct m
//{
// char path;
// int visit;
//};
int main()
{
cin >> R>>C;
int row, col;
char**map = new char*[R];
int**num = new int*[R];
for (int i = 0; i < R; i++)
{
map[i] = new char[C];
num[i] = new int[C];
for (int j = 0; j < C; j++)
{
cin >> map[i][j];
num[i][j] = 0;
if ('B' == map[i][j])
{
row = i; col = j;
}
}
}
search(map,num, row, col);
return 0;
}
void search(char **map,int **num, int r, int c) //这个程序的问题是找到H之后,外面的循环还在继续,所以应该增加一个flag,return,判断,如果flag=1,就跳出return
{
int i = r, j = c;
num[i][j] = 1;
if ('H' != map[i][j])
{
if (i - 1 >= 0 && '#' != map[i - 1][j] && 0 == num[i - 1][j])
search(map, num, i - 1, j);
if (i + 1 < R&&'#' != map[i + 1][j] && 0 == num[i + 1][j])
search(map, num, i + 1, j);
if (j - 1 >= 0 && '#' != map[i][j - 1] && 0 == num[i][j - 1])
search(map, num, i, j - 1);
if (j + 1 < C && '#' != map[i][j + 1] && 0 == num[i][j + 1])
search(map, num, i, j + 1);
}
else if ('H' == map[i][j])
{
cout << 'Y' << endl;
return;
}
else
{
cout << 'N' << endl;
return;
}
}
3、大数四则运算
#include <iostream>
#include <string>
#include <stack>
using namespace std;
string BIGNumMin(string &str1, string &str2);
string BIGNumAdd(string &str1, string &str2);
//加法
string BIGNumAdd(string &str1, string &str2)
{
int sign=1; //符号位
string str;
/*先判断两个数的正负,转化成无符号数进行计算*/
if ('-' == str1[0])
{
if ('-' == str2[0]) //如果两个都为负,符号位置为-,去掉负号进行无符号数加法运算
{
sign = -1;
str=BIGNumAdd(str1.erase(0, 1), str2.erase(0, 1));
}
else //如果一正一负,进行无符号数减法运算
str=BIGNumMin(str2, str1.erase(0, 1));
}
else if ('-' == str2[0])
{
str=BIGNumMin(str1, str2.erase(0, 1));
}
else //两个都为正,进行无符号数加法
{
int r, carry = 0; //carry表示进位
string::size_type i = str1.size(), j = str2.size();
while (i != 0 && j != 0)
{
r = (str1[i - 1] - '0' + str2[j - 1] - '0' + carry) % 10;
carry = (str1[i - 1] - '0' + str2[j - 1] - '0'+carry) / 10;
str = char(r + '0') + str; //str+=(r+'0'),但是用str = char(r + '0') + str的话,char(r+'0')是拼接在str前面的
i--; j--;
}
while (i != 0)
{
r = (str1[i - 1] - '0' + carry) % 10;
carry = (str1[i - 1] - '0' + carry) / 10;
str = char(r + '0') + str;
i--;
}
while (j != 0)
{
r = (str2[j - 1] - '0' + carry) % 10;
carry = (str2[j - 1] - '0' + carry) / 10;
str = char(r + '0') + str;
j--;
}
if (1 == carry) //判断是否还有进位
str = '1' + str;
}
//判断符号位
if (-1 == sign&&str[0] != 0) //str[0]!=0,结果不为0的时候添加负号
str = '-' + str;
return str;
}
//减法
string BIGNumMin(string &str1, string &str2)
{
int sign = 1;
string str;
//判断str1、str2的符号,转化成无符号数的运算
if ('-' == str1[0])
{
if ('-' == str2[0])
str = BIGNumMin(str2.erase(0, 1), str1.erase(0, 1));
else
{
sign = -1;
str = BIGNumAdd(str1.erase(0, 1), str2.erase(0, 1));
}
}
else if ('-' == str2[0])
str = BIGNumAdd(str1, str2.erase(0, 1));
else
{
int r, carry = 0; //carry表示借位
string::size_type i = str1.size(), j = str2.size();
if (!str1.compare(str2)) //如果str1=str2
return "0"; //返回值是string类型
//确保被减数大于减数
if (i < j) //str1长度小于str2,交换它们的值
{
sign = -1;
string temp = str1;
str1 = str2;
str2 = temp;
}
if (i=j&&str1.compare(str2) < 0) //两个字符串长度相等,则用compare逐位比较,如果str1的值小于str2,交换它们的值
{
sign = -1;
string temp = str1;
str1 = str2;
str2 = temp;
}
for (i = str1.size(), j = str2.size(); i != 0 && j != 0; i--, j--)
{
r = str1[i - 1] - str2[j - 1] - carry;
if (r < 0)
{
r += 10;
carry = 1;
}
else
carry = 0;
str = char(r + '0') + str;
}
while (i != 0)
{
r = str1[i - 1] - carry;
if (r < 0)
{
r += 10;
carry = 1;
}
else
carry = 0;
str = char(r + '0') + str;
}
//被减数大于减数,最后肯定没有借位,不用判断
//去掉先导0
str.erase(0, str.find_first_not_of('0'));
if (str.empty())
str = "0";
}
//判断符号位
if ((sign == -1) && (str[0] != '0'))
str = "-" + str;
return str;
}
/*void BIGNumMinus(string &str1, string &str2, string &result)
{
int r,carry=0;
string temp;
int i = str1.size(), j = str2.size();
if (i == j)
{
for (i, j; i != 1; i--, j--)
{
r = str1[i - 1] - str2[j - 1] - carry;
if (r < 0)
{
carry = 1;
r += 10;
}
else
carry = 0;
temp += (r + '0');
}
r = str1[i - 1] - str2[j - 1] - carry;
if (r < 0)
{
r -= 2 * r;
temp += (r + '0');
temp += '-';
}
else if (r>0)
temp += (r + '0');
else
temp = temp;
int len = temp.size();
while (len != 0)
{
len--;
result += temp[len];
}
}
}
*/
int main()
{
string str1, str2, result;
cin >> str1 >> str2;
result=BIGNumAdd(str1, str2);
cout << result << endl;
return 0;
}
4、大数相减
/*
输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果。
备注:1、两个整数都是正整数,2、被减数大于减数
示例:
输入:1000000000000001
1
输出:1000000000000000
*/
这部分代码目前不能提供了,防止华为机考有作弊嫌疑。
5、判断if语句括号是否合法
/*
编程的时候,if条件里面的“(”、“)”括号经常出现不匹配的情况导致编译不过,请编写程序检测输入一行if语句中的圆括号是否匹配正确。
同时输出语句中出现的左括号和右括号数量,如if((a==1)&&(b==1))是正确的,而if((a==1))&&(b==1))是错误的。注意if语句的最外面至少有一对括号。
输入:if((a==1)&&(b==1)) 输出:RIGTH 3 3
输入:if((a==1))&&(b==1)) 输出:WRONG 3 4
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1;
cin >> str1;
int left=0, right=0,flag=0;
int *str2 = new int[str1.size()]; //模拟栈
int cnt=0; //记录栈顶
if (str1[2] != '('&&str1[str1.size()] != ')')
flag = 1;
for (int i = 2; i < str1.size(); i++)
{
if ('(' == str1[i]) //遇到(,压栈
{
if (left != 0 && 0 == cnt) //除第一个括号之外,栈不能为空,否则错
flag = 1;
str2[cnt] =str1[i]; //如果是字符串,不初始化不能使用下标
cnt++;
left++;
}
else if (')' == str1[i]) //遇到),出栈
{
if (0 == cnt) //如果此时栈为空或栈顶不是(,错
flag = 1;
else if (str2[cnt - 1] != '(')
flag = 1;
cnt--;
right++;
}
}
if (1 == flag)
cout << "WRONG " << left << " " << right << endl;
else
cout << "RIGHT " << left << " " << right << endl;
return 0;
}
6、删除重复数字,逆序输出
/*
题目:
输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,
输出的数字是不带重复数字的,所以上面的输出是456321和571。如果是负数,输入-175,输出-571
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
string num1;
cin >> num1;
int len = num1.size();
int temp = 0;
if ('-' == num1[0])
{
string num2;
for (int i = len - 1; i > 0; i--)
{
if (num1[i] != '0')
{
temp = i;
break;
}
}
for (int i = temp; i > 0; i--)
num2 += num1[i];
for (int i = 0; i<num2.size() - 1; i++)
{
for (int j = i + 1; j < num2.size();)
{
if (num2[i] == num2[j])
num2.erase(j,1);
else j++;
}
}
cout <<'-'<< num2<<endl;
}
else
{
string num2;
for (int i = len - 1; i >= 0; i--)
{
if (num1[i] != '0')
{
temp = i;
break;
}
}
for (int i = temp; i>=0; i--)
num2 += num1[i];
for (int i = 0; i<num2.size()-1; i++)
{
for (int j = i + 1; j < num2.size();)
{
if (num2[i] == num2[j])
num2.erase(j,1);
else j++;
}
}
cout << num2 << endl;
}
return 0;
}
7、工时检查
这部分也暂时不能提供了。
8、删除字符串中的指定字符串
/*
问题描述:
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
【输入】 str:输入的被操作字符串
sub_str:需要查找并删除的特定子字符串
【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果
【返回】 删除的子字符串的个数
注:
I、 子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:
在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果
匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
II、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例
输入:str = "abcde123abcd123"
sub_str = "123"
输出:result_str = "abcdeabcd"
返回:2
*/
#include <iostream>
#include <string>
using namespace std;
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
{
int cnt = 0;
int t = 0;
int i = 0;
for (i; i < strlen(str) - strlen(sub_str) + 1;)
{
//与子串首字母相同
if (str[i] == sub_str[0])
{
int j = 0;
//判断剩余是否相同
for (j; j < strlen(sub_str) ; j++) //用strncmp
{
if (str[i + j] != sub_str[j])
break;
}
//如果相同,i后移j个位置
if (j == strlen(sub_str))
{
cnt++; i = i + j;
}
//不相同从i后一个位置重新检查
else
{
result_str[t] = str[i];
t++;
i++;
}
}
//与子串首字母不同,直接放到结果中
else
{
result_str[t] = str[i];
t++;
i++;
}
}
//补上最后的几个字符
for (i; i < strlen(str); i++)
{
result_str[t] = str[i];
t++;
}
result_str[t] = '\0';
return cnt;
}
int main()
{
char str[101], sub_str[101], result_str[101],a;
scanf_s("%c", &a);
int i = 0;
while (a != '\n')
{
str[i] = a;
i++;
scanf_s("%c", &a);
}
str[i] = '\0';
scanf_s("%c", &a);
i = 0;
while (a != '\n')
{
sub_str[i] = a;
i++;
scanf_s("%c", &a);
}
sub_str[i] = '\0';
int cnt = delete_sub_str(str, sub_str, result_str);
cout << result_str << endl;
return 0;
}
9、小熊搬家
#include <iostream>
using namespace std;
void bubsort(int arr[],int n);
int main()
{
int V, N, sum;
sum = 0;
int M[1000];
cin >> V >> N;
for (int i = 0; i < N; i++)
cin >> M[i];
bubsort(M, N);
for (int i = 0, j = N-1; i < j;)
{
if (M[i] + M[j] <= V)
{
sum++;
i++; j--;
}
else
{
sum++;
j--;
}
if (i == j)
{
sum++;
break;
}
}
cout << sum << endl;
return 0;
}
void bubsort(int arr[], int n)
{
int i, j, temp;
for (i = n - 1; i > 0; i--)
{
for (j = 0; j < i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
10、字符串截取
/*
按要求分解字符串,输入两个数M,N,M代表输入的M个待处理的字符串,N代表输出的每串字符串要处理成的位数,不够补0。
例如:
输入:2 8
abc 123456789
输出:abc00000
12345678,90000000
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
int M, N;
cin >> M >> N;
string str1;
for (int i = 0; i < M; i++)
{
cin >> str1;
int len = str1.size();
/*if (0 == len%N)
{
for (int j = 0; j < len; j += N)
{
for (int l = 0; l < N; l++)
cout << str1[j + l];
if (j!=len-N)
cout << ',';
}
}
else
{
for (int j = 0; j < N - (len%N); j++) //先补零
str1 += '0';
for (int j = 0; j < len; j += N)
{
for (int l = 0; l < N; l++)
cout << str1[j + l];
if (j != len - N)
cout << ',';
}
}*/
/*
for (int j = 0; j < len; j++)
{
cout << str1[j];
int l = (j + 1) % N;
if (0 == l&&(j+1)!=len)
cout << ',';
}
for (int j = (len%N); j <= N && (len%N) != 0; j++)
cout << '0';
cout << endl;
*/
int j = 0;
for (j; j<len; j += N) //N个N个输出
{
int l = 0;
for (l; l < N&&(j+l)<len; l++) //(j+l)用来防止最后不够N个的时候溢出
cout << str1[j + l];
if (N==l&&(j+l)!=len) //如果输出够了N个,且不是最后结尾,添加一个逗号
cout << ',';
}
for (int i = 0; (len%N) != 0&&i < N - (len%N); i++) //补零
cout << '0';
cout << endl;
}
return 0;
}
11、字符串消消消
/*
输入两个字符串,将第一个字符串中与第二个字符串相同的部分消掉,直到第一个字符串中没有与第二个字符串相同的部分。
优先消除靠近第一个字符串串首的相同部分。假设两个字符串不会完全相同。
输入:两个字符串,以空格隔开,最大长度为256字符
输出:余下未消除的字符串
样例输入:abc121233 123
样例输出:abc
*/
这部分同理,晚点再贴出来。
12、约瑟夫环变种(忘记问题了)
#include <iostream>
using namespace std;
void array_iterate(int len, int input_array[], int m, int output_array[])
{
int pos=0, res, cnt=0, len1=len;
while (cnt < len)
{
res = m%len1;
if (0 == res)
res = len1;
for (int i = 0; i < res;)
{
if (input_array[pos] != 0)
{
i++;
m = input_array[pos];
pos = (pos + 1) % len;
}
else
pos = (pos + 1) % len;
}
output_array[cnt] = m;
cnt++;
input_array[pos-1] = 0;
len1--;
}
}
int main()
{
int len, m;
cin >> len >> m;
int *input_array = new int[len];
for (int i = 0; i < len; i++)
cin >> input_array[i];
int *output_array = new int[len];
array_iterate(len, input_array, m, output_array);
for (int i = 0; i < len; i++)
cout << output_array[i] << " ";
cout << endl;
return 0;
}
13、去掉最大值最小值剩余个数
/*
输入一串数,以','分隔,输出所有数中去掉最大值、最小值之后剩下的个数。
(其中最大值与最小值可能有多个) Smple input:3,3,5,3,6,9,7,9
Sample outPut: 3
*/
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
vector<int> a;
string b;
/*cin>>b;
for(int i=0;i<b.size();)
{
if(b[i]!=',')
{
int temp=0;
while(b[i]!=','&&i<b.size()) //所有在循环中嵌套循环,然后进行了自增自减的,都要防止溢出
{
temp=10*temp+b[i]-'0';
i++;
}
a.push_back(temp);
}
else
i++;
}*/
char c;int d;
while(cin>>d)
{
a.push_back(d);
scanf("%c",&c);
if('\n'==c)
break;
}
sort(a.begin(),a.end());
int cnt=a.size()-2; //不计最大值和最小值
vector<int>::iterator i=a.begin();
while(*i==*(i+1)&&i<a.end()-1)
{
cnt--;
i++;
}
i=a.end()-1;
while(*i==*(i-1)&&i>a.begin())
{
cnt--;
i--;
}
cout<<cnt<<endl;
return 0;
}
14、选礼仪
/*
要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,
要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。
Smple input:161 189 167 172 188 Sample outPut: 188 189
*/
#include <iostream>
using namespace std;
int main()
{
int height[5];
for(int i=0;i<5;i++)
cin>>height[i];
for(int i=0;i<4;i++)
{
for(int j=0;j<4-i;j++)
{
if(height[j]>height[j+1])
swap(height[j],height[j+1]);
}
}
int minus[4]; //记录身高差
int min=40; //记录最小差值
int pos=0; //记录差值最小位置
for(int i=0;i<4;i++)
{
minus[i]=height[i+1]-height[i];
if(minus[i]<=min) //不能漏掉=号
{
min=minus[i];
pos=i;
}
}
cout<<height[pos]<<" "<<height[pos+1]<<endl;
return 0;
}
15、亮着灯的盏数
/*
题目:亮着电灯的盏数
一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;
接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。
n个学生按此规定走完后,长廊里电灯有几盏亮着。
*/
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double n;
cin>>n;
int cnt=0;
for(int i=1;i<=sqrt(n);i++)
{
cnt++;
}
cout<<cnt<<endl;
return 0;
}
16、划分及格线
/*
题目:从考试成绩中划出及格线
10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 及格线是10的倍数;
(2) 保证至少有60%的学生及格;
(3) 如果所有的学生都高于60分,则及格线为60分
输入:输入10个整数,取值0~100
输出:输出及格线,10的倍数
*/
#include <iostream>
using namespace std;
int main()
{
int line;
int score[10];
for(int i=0;i<10;i++)
{
cin>>score[i];
}
for(int i=0;i<9;i++)
{
for(int j=0;j<10-i-1;j++)
{
if(score[j]<score[j+1])
swap(score[j],score[j+1]);
}
}
if(score[0]>=60)
line=60;
else
line=score[4]/10*10;
cout<<line<<endl;
return 0;
}