2012北邮网研机试

注意:所有代码均是根据题目描述进行了本地测试,没有在北邮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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值