//下面三个本人的代码都没有经过很严密的测试,可能有bug,望参考时注意</span>  

1.【问题描述】

某些整数能分解成若干个连续整数的和的形式,例如
15 = 1 + 2+3+4+5 
15 = 4 + 5 + 6
15 = 7 + 8
某些整数不能分解为连续整数的和,例如:16
输入:一个整数N(N <= 10000)
输出:整数N对应的所有分解组合,按照每个分解中的最小整数从小到大输出,每个分解占一行,每个数字之间有一个空格(每行最后保留一个空格);如果没有任何分解组合,则输出NONE。
/*
*这题可以采用暴力的解法
*注意开始最多是n / 2
*/</span>
#include <cstdio>
int d[200];
int main(){int n, size, t, i, j, sum;bool yes;while(~scanf("%d", &n)){yes = false;t = n / 2;for(i = 1; i <= t; i++){sum = 0;j = i;size = 0;while(sum < n){d[++size] = j;sum += j++;}if(sum == n){for(j = 1; j <= size; j++)printf("%d ", d[j]);puts("");yes = true;}}if(!yes)puts("NONE");}return 0;
}

2.【问题描述】
小岛面积
1 1 0 0 0 1
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
上面矩阵的中的1代表海岸线,0代表小岛。求小岛面积(即被1中包围的0的个数)。注意:仅求这样的0,该0所在行中被两个1包围,该0所在列中被两个1包围。
输入:
第一行输入一个整数N,表示输入方阵的维数
输入一个N维方阵
输出:
小岛面积
样例输入:

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
5
1 1 1 1 0
0 0 1 0 1
1 1 1 0 1
1 0 1 1 1
0 1 1 0 1
5
1 1 1 1 0
0 0 1 0 1
1 0 1 0 1
1 0 1 1 1
0 1 1 0 1
5
1 1 1 1 0
1 0 1 0 1
1 0 1 0 1
1 0 1 1 1
0 1 1 0 1
样例输出:
8
3
2

5

/*
*这个题目是比较简单的,可以使用广搜来搜索,
*因为不满足题目的0只能出现在与边界相连的区域内
*所以可以从四个边上的0开始进行搜索,如果0是有路的话,
*那边界的0能够达到的0都是不满足题目要求的,
*不断标记就行了
*代码没有提交过,可能有瑕疵
*/
#include <cstdio>
#include <queue>
using namespace std;int a[31][31];
int n;
bool mar[31][31];
int pos[4][2] = {{0, 1},{1, 0},{-1 , 0},{0, -1}};//坐标的四个方向struct E{int a, b;void set(int x, int y){a = x;b = y;}
}; queue<E> Q;
void init(E &e, int a, int b){e.set(a, b);Q.push(e);
};void bfs(){E e, t;int a, b;while(!Q.empty()){e = Q.front();mar[e.a][e.b] = true;Q.pop();for(int i = 0; i < 4; i++){a = e.a + pos[i][0];b = e.b + pos[i][1];if(a < 1 || a > n || b < 1 || b > n)continue;else if(!mar[a][b])init(t, a, b);}}
};int main(){int i, j, sum;freopen("in.txt", "r", stdin);//从文件in.txt读入while(~scanf("%d", &n)){sum = 0;for(i = 1; i <= n; i++)for(j = 1; j <= n; j++){scanf("%d", &a[i][j]);mar[i][j] = a[i][j];//一上来把所有的1标记}for(i = 1; i <= n; i++){E e;if(!mar[1][i]){//第一行init(e, 1, i);bfs();}if(!mar[i][1]){//第一列init(e, i, 1);bfs();}if(!mar[n][i]){//最后一行init(e, n, i);bfs();}if(!mar[i][n]){//最后一列init(e, i, n);bfs();}}for(i = 1; i <= n; i++){for(int j = 1; j <= n; j++){if(!mar[i][j])sum++;//数一数最后还有多少组没有标记}}printf("%d\n", sum);}return 0;
}
//方法2,采用回溯法
/*
*采用回溯的方式进行搜索,仍然是从四条边开始,
*每到一个顶点,先把这个顶点标记,
*然后分别对它的四个相邻的坐标进行同样搜索
*术语可能不是很准确
*/
#include <cstdio>
int a[31][31];
int n;
bool mar[31][31];
int pos[4][2] = {{0, 1},{1, 0},{-1 , 0},{0, -1}};//坐标的四个方向void bfs(int a, int b){mar[a][b] = true;//每把一个没有标记的坐标进行搜索,首先把它标记,这个就避免了无限递归for(int i = 0; i < 4; i++){//如果坐标超出范围,跳过这个坐标if(a + pos[i][0] < 1 || a + pos[i][0] > n || b + pos[i][1] < 1 || b + pos[i][1] > n);else if(!mar[a + pos[i][0]][b + pos[i][1]])bfs(a + pos[i][0], b + pos[i][1]);}
}int main(){int i, j, sum;freopen("in.txt", "r", stdin);//从文件in.txt读入while(~scanf("%d", &n)){sum = 0;for(i = 1; i <= n; i++)for(j = 1; j <= n; j++){scanf("%d", &a[i][j]);mar[i][j] = a[i][j];//一上来把所有的1标记}for(i = 1; i <= n; i++){if(!mar[1][i]){//第一行bfs(1, i);}if(!mar[i][1]){//第一列bfs(i, 1);}if(!mar[n][i]){//最后一行bfs(n, i);}if(!mar[i][n]){//最后一列bfs(i, n);}}for(i = 1; i <= n; i++){for(int j = 1; j <= n; j++){if(!mar[i][j])sum++;//数一数最后还有多少组没有标记}}printf("%d\n", sum);}return 0;
}

3.【问题描述】
统计关键字出现位置
输入:
一行标准c语言代码(字符个数小于300),统计出该字符串中关键字的if,while,for所在的位置,按照关键字出现的顺序依次输出。注意双引号内的不需要统计。
输入:一行标准c语言代码,字符个数小于300
输出:
关键字if,while,for对应的位置,按照关键字出现的顺序依次输出。输出格式为:关键字,后跟冒号,然后是出现的位置。扫描到关键字就输出,每个输出占一行。
样例输入:
#include <stdio.h> int main() {int i = 0; if(i == 0) printf("YES"); return 0;}
#include <stdio.h> int main() {int ifwhile = 0; int forif = 1;char if_for_while = 
'a';char *str = "while"; while(ifwhile == 0) {ifwhile = 1;forif = 0;} if(forif == 0) 
{if_for_while = 'b';} if(ifwhile == 1) {if_for_while = 'c';} return 0;}r_while = 'c';} 
return 0;}
样例输出:
if:43
while:88
if:133
if:170
解题思路:
首先把输入字符串切分为一个个的单词,然后对每个单词进行匹配。注意c语言中的strtok函数,不能够返回位置(当分隔符连续时,比如+=,计算出前导的分割符有几个),所以不能满足本题的要求,必须自己写获取单词的函数(反正也不复杂啦)。因为考虑到引号的问题,我们的解决方案是首先对输入字符串进行预处理,将“”内的每个字符都替换为#,然后再进行单词分割(切词),最后进行匹配。具体步骤:
Ø 输入源码字符串预处理,将””内的每个字符替换为#
Ø 一次获取源码中的单词,看是否为查找的关键词,如果是则输出

#include <stdio.h>
#include <ctype.h>
#include <string.h>int main(){char s[301];//保存整个字符串char a[100];//保存单词int st, size;
//  freopen("in.txt", "r", stdin);while(gets(s)){int len = strlen(s);for(int i = 0; i < len; ){printf("i = %d\n", len);size = 0;//如果不是字母的话,判断是不是双引号,要是双引号那就匹配到下一个双引号if(!isalpha(s[i])){if(s[i] == '"')while(s[i++] != '"');elsei++;}//如果是字母"i",那就取一个单词,最后跟if比较,如果是if,那就看看if前是不是空格或者分号,后面是不是空格或者左括号//因为整个程序是一行,所以这样取巧是可以的,while同样的道理else if(s[i] == 'i'){st = i;do{a[size++] = s[i++];}while(isalpha(s[i]));a[size] = 0;if(!strcmp(a, "if") && (s[i] == '(' || s[i] == ' ') && (s[st - 1] == ' '))printf("if:%d\n", st + 1);}else if(s[i] == 'w'){st = i;do{a[size++] = s[i++];}while(isalpha(s[i]));a[size] = 0;if(!strcmp(a, "while") && (s[i] == '(' || s[i] == ' ') && (s[st - 1] == ' ' || s[st - 1] == ';' || s[st - 1] == '}'))printf("while:%d\n", st + 1);}elsei++;}}return 0;
}

2012北京航空航天大学考研机试真题相关推荐

  1. 考研机试真题 日期差值 模拟

    考研机试真题 日期差值 模拟 注意方法二中sscanf的用法 方法一: #include<cstdio> #include<cmath> #include<iostrea ...

  2. 考研机试真题--素数--北京航空航天大学

    关键字:欧式筛法求素数 题目: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1. 输入描述: 输入有多组数 ...

  3. 华科计算机考研机试真题汇总下篇(C语言)

    华科历年机试题汇总 一.2011年华科机试题 1.文本字符 2.整数排序 3.二叉搜索树 二.2012年华科机试题 1.长整数 2.字符串排序 三.2013年华科机试题 1.孪生素数 2.顺转方阵 3 ...

  4. 牛客网计算机考研机试真题-abc

    public class Main{public static void main(String[] args){int c;for(int a=1;a<=4;a++){for(int b=1; ...

  5. 中科大-计算机类考研真题(初试笔试真题详解+复试笔试机试真题详解+面试问题汇总分析)

    中科大-计算机类考研真题(初试笔试真题详解+复试笔试机试真题详解+面试问题汇总分析) 初试笔试真题2003年~2019年:答案+详解 复试面试问题总结:问题汇总+详解分析 复试面试经验总结:个人小结 ...

  6. 【华为机试真题 Python实现】奥运会排行榜【2022 Q1 | 100分】

    文章目录 前言 题目描述 示例 1 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您 ...

  7. [华为机试真题][2014]62.去除重复字符并排序

    题目 描述: 去除重复字符并排序 运行时间限制: 无限制 内容限制: 无限制 输入: 字符串 输出: 去除重复字符并排序的字符串 样例输入: aabcdefff 样例输出: abcdef 代码 /*- ...

  8. 转:[C/C++]2014年7月华为校招机试真题(一)

    [C/C++]2014年7月华为校招机试真题(一) 转载于:https://www.cnblogs.com/kira2will/p/4039521.html

  9. 二叉排序树[2005年华中科技大学计算机保研机试真题]

    题目描述: 输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历. 输入: 输入第一行包括一个整数n(1<=n<=100). 接下来的一行包括n个整数. 输出: 可能有多组测试数据, ...

最新文章

  1. 2022-2028年中国硅质原料行业全景调研及投资前景展望报告
  2. curl header 自定义参数接收不到_如何快速有效的通过curl命令来检测url告警机制?...
  3. Eclipse RCP 中将窗口始终保持在最前
  4. 狼的十大“处世哲学”~~(有关狼的图片)
  5. 在线设计 html5 表单,html5注册表单制作-表单制作-小程序表单制作
  6. [ ArcGIS for Server 10.1 系列 ] - 分布式部署GIS Servers
  7. 解答互联网创业中,你肯定会遇到的问题!
  8. Android Studio Gradle两种更新方式
  9. mysql视图转sql server视图_SQL Sever MYSQL 视图实现的 2 种方式
  10. linux挑战:历史命令_博客挑战:分享您关于社区运作方式的知识
  11. java死锁的产生原因,操作系统产生死锁的原因和处理策略
  12. UVa 202 Repeating Decimals
  13. python之HTTP处理模块urllib和urllib2
  14. ssh自动登陆和scp自动拷贝文件
  15. 云计算是什么?云计算开发学习路线
  16. s3c6410裸机调试方式总结
  17. 三星手机投屏电脑教程 手机和电脑同屏
  18. 什么是商业智能(BI)?
  19. 魔兽争霸官方平台支持Linux,首页-魔兽争霸官方对战平台
  20. 看董事长陈睿11周年演讲,一起了解B站未来的三个使命吧

热门文章

  1. 随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同
  2. 【Java语言】交换两个数的数值
  3. 程序员必备的 17 款强有力武器,你拥有几个!
  4. 动物识别系统代码python_动物识别专家系统课程设计
  5. C# 面向对象-面向对象概述
  6. MeanTeacher文章解读+算法流程+核心代码详解
  7. matlab 数据透视表,MATLAB | 用行为数据处理EEG数据事件码
  8. CTFHUB-Bak文件
  9. 计算机表格边框,高会《职称计算机》Word 2007:设置表格边框和底纹
  10. 首席新媒体运营教程:电商UGC社区运营全攻略电商