OJ题练习

算法练习

1.计算三角形的边

题目描述

给出三个正整数,计算最小的数加上次小的数与最大的数之差。

输入

每一行包括三个数据a, b, c,并且都是正整数,均小于10000。
*/
1 2 3
6 5 4
10 20 15
1 1 100
0 0 0

输出

对于输入的每一行,在单独一行内输出结果s。s=min(a,b,c)+mid(a,b,c)-max(a,b,c)。上式中,min为最小值,mid为中间值,max为最大值。 
*/
0
3
5
-98

代码

int min(int a,int b,int c){
	 int x;
	 if(a<=b){
	 	x=b;
	 }
	 if(x<=c){
	 	x=c;
	 }
	return x;
	
}
// run this program using the console pauser or add your own getch, system("pause") or input loop 

int main() {
	int a,b,c,temp;
	scanf("%d %d %d",&a,&b,&c);
	int min_x=min(a,b,c);
	if(min_x==a){
		temp=(b+c)-a;
	}else if(min_x==b){
		temp=(a+c)-b;
	}else{
		temp=(a+b)-c;
	}
	printf("%d",temp); 
	return 0;
}

2.指定矩阵相乘

题目描述

输入为两个矩阵,其中一个为2×3的矩阵,另一个为3×2的矩阵

输入

/*
输入为两个矩阵,其中一个为2*3的矩阵,另一个为3*2的矩阵
*/
1 2 3
3 4 5
6 7
8 9
10 11

输出

/*
一个2*2的矩阵(每一个数字后都跟一个空格) 
*/
52 58
100 112

代码

void Mult_A_B(int A[][3],int B[][2]){
	int c[2][2]={0};
	int i,j,k;
	for(i=0;i<2;i++){
		for(j=0;j<2;j++){
			for(k=0;k<3;k++){
				c[i][j]+=A[i][k]*B[k][j];  //将 c[i][j]+=A[i][k]*B[k][j]写成c[i][j]+=A[i][k]*B[k][i] 
			}
		}
		
	}
	for(i=0;i<2;i++){
		for(j=0;j<2;j++){
			printf("%d  ",c[i][j]);
		}
		printf("\n");
	}
	
}
int main(){
	int A[2][3];
	int B[3][2];
	int i,j;
	for(i=0;i<2;i++){
		for(j=0;j<3;j++){
			scanf("%d",&A[i][j]);
		}
	}
	printf("A=\n");
	for(i=0;i<2;i++){
			for(j=0;j<3;j++){
				printf("%d ",A[i][j]);
			}
			printf("\n");
		}
	printf("\n");
	for(i=0;i<3;i++){
		for(j=0;j<2;j++){
			scanf("%d",&B[i][j]);
		}
	}
	printf("B=\n");
	for(i=0;i<3;i++){
			for(j=0;j<2;j++){
				printf("%d ",B[i][j]);
			}
			printf("\n");
		}
	printf("A和B相乘之后的矩阵为:\n");
	Mult_A_B(A,B);
	return 0;
}

3.去掉s中所有的c字符

题目描述

输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。

输入

/*
测试数据有多组,每组输入字符串s和字符c。
*/
heallo
a

输出

对于每组输入,输出去除c字符后的结果。 
*/
hello

代码

void sub_c(char s[],char c){
	int i,k;
	int len=strlen(s);
	printf("len(s)=%d\n",len);
	char p[101];
	int j=0;
	for(i=0;i<len;i++){
		if(s[i]!=c){
			p[j++]=s[i];
			}
	}	
	int leng=strlen(p);
	printf("leng(p)=%d\n",leng);
	for(k=0;k<leng;k++){
		printf("%c",p[k]);
	}	
	printf("\n");
}



int main(){
	char s[101];
	char c;
	scanf("%s %c",&s,&c);
	sub_c(s,c);
	return 0;
} 

4.十个数里的最大值

题目

测试数据有多组,每组10个整数。

输入

/*
测试数据有多组,每组10个整数。
*/
10 22 23 152 65 79 85 96 32 1

输出

/*
对于每组输入,请输出其最大值(有回车)。 
*/
max=152

代码

//10个数里的最大值 
void max_value(int A[]){
	int temp=A[0];
	for(int i=0;i<10;i++){
		if(temp<=A[i]){
			temp=A[i];
		}
	}
	printf("%d\n",temp);
}


int main(){
	int A[10];
	for(int i=0;i<10;i++){
		scanf("%d",&A[i]);
	}
	max_value(A);
	return 0;
}

5.字符串排序

题目

输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。

输入

/*
测试数据有多组,输入字符串。
*/
bacd

输出

/*
对于每组输入,输出处理后的结果。
*/
abcd

代码

void strSort(char s[201]){
	int len=strlen(s);
	sort(s,s+len);
	printf("%s",s);
}
 
int main(){
	char s[201];
	while(scanf("%s",&s)!=EOF){
		strSort(s);
	}
	return 0;
}

6.棋盘问题

题目

在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

输入

3
1 2

输出

   3    3    4    4    8    8    9    9
   3    2    0    4    8    7    7    9
   5    2    2    6   10   10    7   11
   5    5    6    6    1   10   11   11
  13   13   14    1    1   18   19   19
  13   12   14   14   18   18   17   19
  15   12   12   16   20   17   17   21
  15   15   16   16   20   20   21   21

代码

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int matrix[200][200];
int num=0;

int  chessBord(int tr,int tc,int dr,int dc,int size){
	if(size==1) return 0;
	int t=++num;
	int s=size/2;
	
	if(dr<tr+s&&dc<tc+s){
		chessBord(tr,tc,dr,dc,s);   //如果特殊方格在左上角,调用递归 
	}else{
		matrix[tr+s-1][tc+s-1]=t;   //如果特殊方格不在左上角,先对右下角的表格做标记; 
		chessBord(tr,tc,tr+s-1,tc+s-1,s);  //调用递归处理剩下的表格 
	}
	

	if(dr<tr+s&&dc>tc+s-1){
		chessBord(tr,tc+s,dr,dc,s);
	}else{
		matrix[tr+s-1][tc+s]=t;
		chessBord(tr,tc+s,tr+s-1,tc+s,s);
	}
	
	if(dr>tr+s-1&&dc<tc+s){
		chessBord(tr+s,tc,dr,dc,s);
	}else{
		matrix[tr+s][tc+s-1]=t;
		chessBord(tr+s,tc,tr+s,tc+s-1,s);
	}
	
	
	if(dr>tr+s-1&&dc>tc+s-1){
		chessBord(tr+s,tc+s,dr,dc,s);
	}else{
		matrix[tr+s][tc+s]=t;
		chessBord(tr+s,tc+s,tr+s,tc+s,s);
	}
}

int main(){
	int size,k,tr,tc,dr,dc; //size为棋牌的尺寸   tr为棋盘的行数 tc为棋盘的列数 dr为特殊方格的行数 dc为特殊方格的列数 
	scanf("%d",&k);
	scanf("%d %d",&dr,&dc);
	size=int (pow(2,k));
	tr=0,tc=0;
	chessBord(tr,tc,dr,dc,size);
	for(tr=0;tr<size;tr++){
		for(tc=0;tc<size;tc++){
			printf("%4d",matrix[tr][tc]);
			}
		printf("\n");
	}
	return 0;
} 

7.过河卒

题目

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下或向右。同时在棋盘上的任一点有一个对方的马(如图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如图中C点上的马可以控制9个点。卒不能走到对方马的控制点。
棋盘用坐标表示,A点坐标(0,0)、B点坐标(n, m) (n,m为不超过20的整数,并由键盘输入),同样马的位置坐标C是需要给出的(C≠A,且C≠B)。现在要求你计算出卒从A点能够到达B点的路径条数。
在这里插入图片描述

输入

6 6 3 2

输出

17
#include<iostream>
using namespace std;
#define int long
#define maxsize 21
int dr[8][2] = {{2,1},{1,2},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}};
int dp[maxsize][maxsize];
int mp[maxsize][maxsize];
int n,m,x,y;
int main()
{
	int i,j;
	cin>>n>>m>>x>>y;
	mp[x][y] = 1;
	dp[0][0] = 1;
	for(i=0;i<8;i++){
		mp[x+dr[i][0]][y+dr[i][1]] = 1;
	}
	for(i=0;i<=n;i++)
		for(j=0;j<=m;j++)
		{
			if(!mp[i+1][j]) dp[i+1][j] += dp[i][j];
			if(!mp[i][j+1]) dp[i][j+1] += dp[i][j];
		}
	cout<<dp[n][m]<<endl;
	return 0;
}

8.铺设地砖

题目

小明最近新买了一个房间,为了给它做装修,想要给它铺上地砖。然而现有的地砖只有两种规格分别为1米1米、2米2米,由于小明买的房间有点小,宽度只有3米,长度为N米。当然这样一个房间也足够他自己一个人住了。那么如果要给这个房间铺设地砖,且只用以上这两种规格的地砖,请问有几种铺设方案。

输入

2
2
3

输出

3
5

代码

using namespace std;
int a[31];
int main()
{
	int n=0,k=0;
	int i=0;
	a[1]=1;
	a[2]=3;
	for(i=3;i<=30;i++)
	{
		a[i] = 2*a[i-2]+a[i-1];
	}
	cin>>n;
	for(i=n;i>0;i--){
		cin>>k;
		cout<<a[k]<<endl;
	}
	return 0;
}

9.找数字

题目

给定一组无序数值,数值的大小在1到百万之间,数值的个数在10-50万个之间。现需要找出其中第5到第10小的整数。

输入

1
2
3
4
5
6
7
8
9
10
0

输出

5
6
7
8
9
10

代码

#include <stdio.h>
#include <string.h>
//using namespace std;

int a[500001];

int find(int low,int high,int k){
	int temp=a[low];
	int low_temp=low;
	int high_temp=high;
	while(low<high){
	
		while(low<high&&a[high]>=temp){
			high--;
		}
		a[low]=a[high];
		while(low<high&&a[low]<=temp){
			low++;
		}
		a[high]=a[low];
	}

	a[low]=temp;
	if(low==k){ 
		return a[low];
	}
	else if(low>k){
		return find(low_temp,low-1,k);
	}
	else return find(low+1,high_temp,k);
}

void main(){
	int x, num;
	for(num=0;;num++){
		scanf("%d",&x);
		if(x==0) break;
		a[num]=x;
	}
	for(int i=5;i<=10;i++){
		x=find(0,num-1,i-1);
		printf("%d\n",x);
	}
}