hnucm-oj1166 - 2021年春季学期《算法分析与设计》练习4
A 1036: 字符识别?
题目描述
你的任务是写一个程序进行字符识别。别担心,你只需要识别1, 2, 3,如下:
.. *** ***
.. …* …*
.. *** ***
.. … …
.. *** ***
输入
输入仅包含一组数据,由6行组成。第一行为字符的个数n(1<=n<=10)。以下5行每行包含4n个字符。每个字符恰好占5行3列,然后是一个空列(用"."填充)。
输出
输出应包含一行,即识别出的各个字符。
样例输入 Copy
3
.…..
.…….
.…..
.…….
.…..
样例输出 Copy
123
#include <stdio.h>
#include <stdlib.h>
int main(){
int n;
scanf("%d",&n);
getchar();
int b=4*n;
char ch[5][b];
for(int i=0;i<5;i++){
for(int j=0;j<b;j++){
scanf("%c",&ch[i][j]);
}
getchar();
}
for(int i=0;i<b;i+=4){
if(ch[3][i]=='*')
printf("2");
if(ch[3][i+1]=='*')
printf("1");
if(ch[3][i+2]=='*')
printf("3");
}
}
B 1407: 数的划分
题目描述
使用递归编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。
输入
多组输入,每一组是一个正整数n。
输出
输出划分数。
样例输入 Copy
3
4
样例输出 Copy
3
5
#include <stdio.h>
#include <stdlib.h>
int f(int n,int m){
if((n<1)||(m<1))
return 0;
if((n==1)||(m==1))
return 1;
if(n<m)
return f(n,n);
if(n==m)
return 1+f(n,n-1);
return f(n,m-1)+f(n-m,m);
}
int main(){
int n,sum;
while(scanf("%d",&n)!=EOF){
sum=f(n,n);
printf("%d\n",sum);
}
}
C 1411: 幸运人士
题目描述
一次大型派对的最后节目是选出一位幸运人士,该人士将获得派对组织者准备的一个钻石戒指。
而选择幸运人士的办法是让所有人员一字排列,然后从左至右点数,凡是奇数号的全部剔除。
对于剩下的人员,又从左至右点数,逢奇数号就剔除。
如此不断递归下去,直到只剩下一个人为止,此人即为幸运之人。
请设计一个递归算法计算幸运之人所在的位置。
输入
多组数据,每组输入一个正整数n。
输出
输出最后剩下的那个人的位置。
样例输入 Copy
1
2
3
样例输出 Copy
1
2
2
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int fun(int a,double b){
if(a<pow(2,b)){
b=b-1.0;
return pow(2,b);
}
if(a==pow(2,b))
return pow(2,b);
if(a>pow(2,b)){
b=b+1.0;
fun(a,b++);
}
}
int main(){
int n;
double b=0.0;
while(scanf("%d",&n)!=EOF){
int m=fun(n,b);
printf("%d\n",m);
}
}
D 1427: 线性搜索
题目描述
请编写一个程序,输入包含n(n<=10000)个整数的数列S以及包含q个(q<=500)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于10^9,T的元素不重复。
输入
多组输入。
每一组输入的第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。
输出
用1行输出C。
样例输入 Copy
5
1 2 3 4 5
3
3 4 1
样例输出 Copy
3
#include <stdio.h>
#include <stdlib.h>
int main(){
long long int n,q;
long long int s[10000],t[500];
while(scanf("%lld",&n)!=EOF){
int c=0;
for(int i=0;i<n;i++)
scanf("%lld",&s[i]);
scanf("%lld",&q);
for(int i=0;i<q;i++)
scanf("%lld",&t[i]);
for(int i=0;i<n;i++){
for(int j=0;j<q;j++){
if(s[i]==t[j])
c++;
}
}
printf("%d\n",c);
}
}
E 1418: 二分搜索(递归)
题目描述
使用递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2
样例输出 Copy
2
-1
#include <stdio.h>
#include <stdlib.h>
int fun(int a[],int left,int right){
int mid=(left+right)/2;
while(left<=right){
mid=(left+right)/2;
if(a[a[0]+1]==a[mid])
return mid;
if(a[a[0]+1]<a[mid]){
right=mid-1;
fun(a,left,right);
}
else{
left=mid+1;
fun(a,left,right);
}
}
return -1;
}
int main(){
int n[100],m;
while(scanf("%d",&n[0])!=EOF){
int left=1,right=n[0];
for(int i=1;i<=(n[0]+1);i++)
scanf("%d",&n[i]);
m=fun(n,left,right);
printf("%d\n",m);
}
}
F 1419: 二分搜索(非递归)
题目描述
使用非递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2
样例输出 Copy
2
-1
#include <stdio.h>
#include <stdlib.h>
int main(){
int n[100],m;
while(scanf("%d",&n[0])!=EOF){
int left=1,right=n[0];
for(int i=1;i<=(n[0]+1);i++)
scanf("%d",&n[i]);
while(left<=right){
int mid=(left+right)/2;
if(n[n[0]+1]==n[mid]){
printf("%d\n",mid);break;
}
if(n[n[0]+1]>n[mid])
left=mid+1;
else
right=mid-1;
}
if(left>right)
printf("-1\n");
}
}