北航研究生复试机试真题-2012年
发布时间
阅读量:
阅读量
2012年北航机试真题
1、整数分解
某些整数能分解成若干个连续整数和的形式,例如:
15=1+2+3+4+5
15=4+5+6
15=7+8
某些整数不能分解为连续整数的和,例如16。
输入:一个整数N(N<10000)
输出:整数N对应的所有分解组合,按照分解组合中的最小整数从小到大输出,每个分解占一行,每个数字之间有一个空格(每行最后保留一个空格),如果没有任何分解组合,则输出NONE。
自测代码: 直接暴力解的,不确定会不会超时。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
int i=1,flag=0;
while(i<=n/2)
{
int j=i+1,sum=n-i;
vector<int> rec;
rec.clear();
rec.push_back(i);
while(sum>0)
{
sum=sum-j;
rec.push_back(j);
j++;
}
if(sum==0)
{
//i=j;
cout<<n<<" = "<<*rec.begin();
for(int k=1;k<rec.size();k++)
{
cout<<" + "<<rec[k];
}
cout<<endl;
flag=1;
}
i++;
}
if(flag==0) cout<<"NONE";
return 0;
}
2、小岛面积
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
上面矩阵中的1代表海岸线,0代表小岛,求小道面积。
即仅求这样的0。该0在行中被两个1包围,该0在列中被两个1包围。
样例:
样例输入:
6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
样例输出:(不能完全被1围住的0不算)
8
思路: 确定一个最大的圈,用一圈1包围尽可能多的0。边界确定后直接计算在里面的0的数量即可。
自测代码:
#include<iostream>
using namespace std;
const int N=1010;
int land[N][N];
pair<int,int> row[N],col[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>land[i][j];
for(int i=0;i<n;i++)
{
row[i].first=n;
row[i].second=-1;
col[i].first=n;
col[i].second=-1;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(land[i][j] == 1)
{
if(row[i].first == n) row[i].first=j;
else row[i].second=j;
if(col[j].first == n) col[j].first=i;
else col[j].second=i;
}
int res=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(land[i][j] == 0)
{
if(i>col[j].first && i<col[j].second && j>row[i].first && j<row[i].second)
res++;
}
}
cout<<res;
return 0;
}
3.统计关键字的出现位置
输入:一行标准的c语言代码(字符数小于300),统计出该字符串中关键字的if,while,for所在的位置,按照关键字出现的顺序依次输出,注意双引号内的不需要统计。输出格式为:关键字,后跟冒号,然后是出现的位置。扫描到关键字就输出,每个输出占一行。
样例输出:
if:43
while:88
if:133
if:170
思路: 直接扫描比对。
全部评论 (0)
还没有任何评论哟~
