北航上机复试2012-第一题-第二题-第三题

来源:互联网 发布:爱丽丝伪娘团 淘宝 编辑:程序博客网 时间:2024/04/29 10:40

 

 

【问题描述】

某些整数能分解成若干个连续整数的和的形式,例如
15 = 1 + 2+3+4+5 
15 = 4 + 5 + 6
15 = 7 + 8
某些整数不能分解为连续整数的和,例如:16
输入:一个整数N(N <= 10000)
输出:整数N对应的所有分解组合,按照每个分解中的最小整数从小到大输出,每个分解占一行,每个数字之间有一个空格(每行最后保留一个空格);如果没有任何分解组合,则输出NONE。

 

【解题思路】

我认为这个题目有一些问题,整数包括正整数负整数和0,这样每一个正整数n都可以分解为 –(n-1), -(n-2), ……, -1, 0, 1, 2, ……, n;每一个负整数-n都可以分为-n, -(n-1), -(n-2), ……,-1, 0, 1, ……,n-1;0不可以分解为连续的整数。

 

【问题描述】

小岛面积
       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代表小岛。求小岛面积(即被1中包围的0的个数)。注意:仅求这样的0,该0所在行中被两个1包围,该0所在列中被两个1包围。
输入:

第一行输入一个整数N,表示输入方阵的维数
  输入一个N维方阵
输出:

小岛面积

样例输入:

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

样例输出:

8

 

【解题思路】

设立了一个L,R,U,D矩阵,如果矩阵中第i行第j列为1表示该点左边有海,同理生成R,U,D矩阵,若满足LRUD矩阵都为1而且本身也是陆地的话那么该点是小岛。

 

【代码】


#include <stdio.h>const int maxn = 110;int L[110][110];int R[110][110];int U[110][110];int D[110][110];int mat[110][110];int main() {int n, i, j, ans = 0;int flag = 0;freopen("A.txt", "r", stdin);scanf("%d", &n);for(i = 0; i < n; i++) {for(j = 0; j < n; j++) {scanf("%d", &mat[i][j]);}}//Lfor(i = 0; i < n; i++) {flag = 0;for(j = 0; j < n; j++) {if(mat[i][j] == 1) flag = 1;if(flag) L[i][j] = 1;else L[i][j] = 0;}}//Rfor(i = 0; i < n; i++) {flag = 0;for(j = n-1; j >= 0; j--) {if(mat[i][j] == 1) flag = 1;if(flag) R[i][j] = 1;else R[i][j] = 0;}}//Ufor(j = 0; j < n; j++) {flag = 0;for(i = 0; i < n; i++) {if(mat[i][j] == 1) flag = 1;if(flag) U[i][j] = 1;else U[i][j] = 0;}}//Dfor(j = 0; j < n; j++) {flag = 0;for(i = n-1; i >= 0; i--) {if(mat[i][j] == 1) flag = 1;if(flag) D[i][j] = 1;else D[i][j] = 0;}}for(i = 0; i < n; i++) {for(j = 0; j < n; j++) {if(L[i][j] && R[i][j] && U[i][j] && D[i][j] && mat[i][j] == 0) ans++;}}printf("%d\n", ans);return 0;}


【统计关键字出现位置】

输入:

一行标准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;charif_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;}

样例输出:

if:43
while:88
if:133
if:170

 

【分析】

1.  出题人可能搞错了,第二个样例的答案应该是while:108  if:153 if:170

2.  观察到每一个if和while和for后面跟着一个括号,因此按照“if(”,“while(”,“for(”来匹配。

 #include <string.h>
#include <stdio.h>
char s[302];

main()
{int valid;
int i, j, k, l, m, n, w;
freopen("2012_3_string.txt","r",stdin);//

i = 0, w = 0;
while( gets(s) ){
l = strlen(s);
//cout << l << endl;
valid = 1;
for(i=0;i<l;i++){
if( s[i] == '"' ) valid = 1 - valid; //遇到双引号
if( !valid ) continue;
if( s[i] == 'i' ){
if( s[i+1] == 'f'
&& ( s[i+2] == ' ' || s[i+2] == '(' )
&& ( s[i-1] == ' ' || s[i-1] == ';' ) )
printf("if:%d\n",i+1);
}
else if( s[i] == 'w' ){
if( s[i+1] == 'h' && s[i+2] == 'i' && s[i+3] == 'l' && s[i+4] == 'e'
&& ( s[i+5] == ' ' || s[i+5] == '(' )
&& ( s[i-1] == ' ' || s[i-1] == ';' ) )
printf("while:%d\n",i+1);
}
else if( s[i] == 'f' ){
if( s[i+1] == 'o' && s[i+2] == 'e'
&& ( s[i+3] == ' ' || s[i+3] == '(' )
&& ( s[i-1] == ' ' || s[i-1] == ';' ) )
printf("for:%d\n",i+1);
}
}
}
}

原创粉丝点击