2012北京航空航天大学考研机试真题
 发布时间 
 阅读量: 
 阅读量 
    //下面三个本人的代码都没有经过很严密的测试,可能有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;
    
 }
    
    
    
    
    代码解释
        问题描述
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;
    
 }
    
    
    
    
    代码解释
        问题描述
 #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++] != '"');
    
 					else
    
 						i++;
    
 			}//如果是字母"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);
    
 			}
    
 			else
    
 				i++;
    
 		}
    
 	}
    
 	return 0;
    
 }
    
    
    
    
    代码解释
        全部评论 (0)
 还没有任何评论哟~ 
