注意:所有代码均是根据题目描述进行了本地测试,没有在北邮oj上测试,不保证一定能AC。
点击链接查看历年机试题目汇总。
A打印字符串
题目描述
老师有一个问题想考考mabo,但是mabo不会,所以想请你来帮帮忙。
问题如下:
给一串字符串,统计其中某个字符的个数。
输入:
首先输入一个整数T,表示一共有T组数据 0<T<=10。
接下来每行一个字母x(x为’a’-'z’或者‘A’-‘Z’)。
然后下面一行输入一个字符串s(0<s的长度<1000)。
输出:
统计这个字母在这个字符串中出现的次数
样例输入
2
a
absd
b
bbssb
样例输出
1
3
解析
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
char x;
cin>>x;
char s[1001];
cin>>s;
int count=0;
for(int i=0;i<strlen(s);i++)
{
if(s[i]==x) count++;
}
cout<<count<<endl;
}
return 0;
}
B 二叉树的层数
题目描述
老师有一个问题想考考mabo,但是mabo不会,所以想请你来帮帮忙。
问题如下:
给一个二叉树
请把这个棵二叉树按层来打印。如果为相同层,需要从左到右打印。一个节点是先添加左节点后添加右节点,即添加顺序与输入顺序一致。
输入:
首先输入一个整数T,表示一共有T组数据?0<T<=10
再输入两个整数N,M(0<=N,M<=100)
表示下面有N行,这个树有M个节点(1号节点是这棵树的根节点)
每一行两个整数a,b(1<=a,b<=M)
表示节点a的父亲是节点b
输出:
对于每组
先输出一行?"Qi:"表示第i个问题
然后接下来输出每个问题二叉树每层的节点,在同一层的节点用空格分开,同一层输出在一行(每一行末尾没有空格),不同的层输出在不同行(入下面Sample Ouput所示)
样例输入
2
4 5
2 1
3 1
4 2
5 4
1 2
2 1
样例输出
Q1:
1
2 3
4
5
Q2:
1
2
解析
使用map记录父节点与孩子节点的映射关系,层次遍历使用队列,
由于每层要输出到一行,所以增设一个队列用于缓冲,当前队列只存储同一层的节点
#include <iostream>
#include <map>
#include <queue>
#include <vector>
using namespace std;
int main()
{
int T;
cin>>T;
for(int t=1;t<=T;t++)
{
int n,m,a,b;
map<int,vector<int> >node;
queue<int> q;
queue<int> buf; //用于缓冲
cin>>n>>m;
if(!m) //0个节点
{
cout<<"Q"<<t<<":"<<endl;
continue;
}
while(n--)
{
cin>>a>>b;
node[b].push_back(a);
}
cout<<"Q"<<t<<":"<<endl;
q.push(1); //根节点入队
while(!q.empty())
{
int len=q.size();
for(int i=0;i<len;i++)
{
int cur=q.front();
cout<<cur;
if(i!=len-1) cout<<" ";
for(unsigned int j=0;j<node[cur].size();j++) //当前节点的子节点放入缓冲区
{
buf.push(node[cur][j]);
}
q.pop();
}
cout<<endl;
//处理完一层 ,将缓冲区中存储的下一层节点入队
int lenb=buf.size();
for(int i=0;i<lenb;i++)
{
q.push(buf.front());
buf.pop();
}
}
}
return 0;
}
C IP地址
题目描述
我们都学过计算机网络,了解IPV4地址的点分十进制表示法。
你的任务很简单:判断一个字符串是否是一个合法的点分十进制表示的IPV4地址。
最低的IP地址是0.0.0.0,最高的IP地址是255.255.255.255。
PS :方便起见,认为形似00.00.00.00的IP地址也是合法的。
输入格式
第一行是一个整数T,代表输入还剩下T行
以下的T行,每行都是一个字符串(不含空白字符)。字符串的长度保证不超过15,不小于1.
输出格式
对于每个字符串,输出一行。
如果它是一个合法的IPV4地址,输出Yes。
否则,输出No。
样例输入
3
59.64.130.18
f.a.t.e
1.23.45.678
样例输出
Yes
No
No
解析
据说这道题有坑,我的代码应该过不了。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
char a[16];
cin>>a;
if(!(a[0]>='0'&&a[0]<='9')||strlen(a)<7) //首字母非数字或长度小于7
{
cout<<"No"<<endl;
continue;
}
int ok=1,sum=0,count=0;
for(int i=0;i<strlen(a);i++)
{
if(a[i]>='0'&&a[i]<='9') sum=sum*10+a[i]-'0';
else if(a[i]=='.'&&i!=strlen(a)-1) //点不能是最后一个字符
{
count++;
sum=0;
}
else //非法字符
{
ok=0;
break;
}
if(sum>255||count>3) //数字超范围或者超个数
{
ok=0;
break;
}
}
if(count!=3) ok=0;
if(ok) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
D 最远距离
题目描述
正义的伙伴褋祈和葬仪社的机器人Fuyuneru正在被邪恶的GHQ部队追杀。眼看着快要逃不掉了,祈就把重要的东西塞到了机器人体内,让它先跑,自己吸引火力。
假设Fuyuneru带上东西开始逃跑时所处的点为原点,朝向为正北。操纵FuyuNeru的指令有如下四种:
right X: X是1-359之间的整数,Fuyuneru的前进方向顺时针转X度。
left X: X是1-359之间的整数,Fuyuneru的前进方向逆时针转X度。
forward X: X是整数(0<=X<=1000),Fuyuneru向当前朝向前进X米。
backward X: X是整数(0<=X<=1000),Fuyuneru向当前朝向后退X米。
现在祈向Fuyuneru体内输入了N(1<=N<=50)个这样的指令。可是由于此前Fuyuneru被GHQ部队击中,它出了一点小问题:这N个指令执行的顺序是不确定的。
问:Fuyuneru最远可能逃出多远?
即,Fuyuneru在执行完N条指令之后,距离原点最远的可能距离是多少?
输入格式
第一行是一个整数T,代表测试数据有T组。
每组测试数据中,第一行是一个整数N,代表指令有N条;
随后紧跟N行,每一行代表一个指令(格式保证是上述四种中的一种,数据保证合法)
输出格式
对于每组数据,输出一行:最远的可能逃亡距离,精确到小数点后3位。
样例输入
3
3
forward 100
backward 100
left 90
4
left 45
forward 100
right 45
forward 100
6
left 10
forward 40
right 30
left 10
backward 4
forward 4
样例输出
141.421
200.000
40.585
解析
将向前走和向后走的分别加起来,当旋转角度为180度时走的是直线最长,
于是寻找最可能接近180度的角度(角度进行全排列然后判断),然后用余弦公式进行求解。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#define PI 3.1415926535
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int N,x;
vector<int> angle;
int front=0,back=0;
string s;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>s>>x;
if(s=="forward") front+=x;
else if(s=="backward") back+=x;
else if(s=="left") angle.push_back(360-x);
else if(s=="right") angle.push_back(x);
}
int min=360;
sort(angle.begin(),angle.end()); //next_permutation函数返回的是比当前排列大的排列的bool值,所以要先对数组进行排序,以防漏掉较小的排列
do
{
int sum=0;
for(unsigned int i=0;i<angle.size();i++)
{
sum+=angle[i];
sum=sum%360;
if(fabs(sum-180)<min) min=fabs(sum-180);
}
}while(next_permutation(angle.begin(),angle.end()));
double t=fabs(2*front*back*cos(min/180.0*PI));
t=fabs(front*front+back*back-t);
cout<<fixed<<setprecision(3)<<sqrt(t)<<endl;
}
return 0;
}