2015西工大计算机机试参考代码

1

题目描述

求最小数
每次给定3个数(均用int表示),要求找出3个数里的最小的一个,并输出最小的数

输入

a b c 三个数用空格隔开

输出

a b c 中最小的一个数

输入样例

5 3 98

输出

3

参考代码

#include <cstdio>

int main(){
	int a, b, c;
	int min;
	scanf("%d%d%d",&a, &b, &c);
	min=(a>b?b:a);
	min=(min>c?c:min);
	printf("%d\n", min);
}

2

题目描述

将一个10进制的数转换为二进制数

输入

输入一个10000位以内的十进制数

输出

转换为二进制后输出

输入样例

1030

输出

10000000110

参考代码

算法思想:除基取余
基为要转换成的进制Q,本题中Q=2。
每次将待转换数除以Q,然后取余数存起来,商继续除以Q并重复上述操作,最后商为0即可结束
将存起来的余数按从高到低输出即可得到Q进制数

#include <cstdio>


int main(){
	int r[40], num = 0;		//数组r存放二进制数y的每一位,num为存储的位数
	int y;			//十进制数
	scanf("%d", &y);
	do
	{
		r[num++] = y % 2;		//转换为8进制将2换成8即可,以此类推
		y = y / 2;
	}while(y != 0);
	
	for(int i = num - 1; i >= 0; i--)
		printf("%d", r[i]);
	printf("\n");
}

3

题目描述

有一个迷宫,迷宫里有一个人,迷宫是N*N的方格,人处于某一位置,可以选择向上下左右前进,但是要保证面对的不是墙壁,否则无法向前行走

输入

迷宫的规格,是一个正整数N(2<=N<=20)表示,占一行;输入一堆数据m,n(第m行,第n列),表示人所在的位置坐标,以空格隔开,占一行;输入要尝试前进的方向
”w“”s“”a“”d“分别代表上、下、左、右,占一行

输出

”Y“
表示可以向该方向前进;最后一行输出回车
”N“
表示可以向该方向前进;最后一行输出回车

输入样例

4
0 3
s

输出

Y

参考代码

//switch case判断边界
#include <cstdio>

int main(){
	int size;		//规格
	scanf("%d", &size);
	int m, n;		//坐标
	scanf("%d%d", &m, &n);
	getchar();
	char d;			//前进方向
	scanf("%c", &d);
	switch(d)
	{
		case 'w':
			if(m == 0)
				printf("N\n");
			else
				printf("Y\n");
			break;
		case 's':
			if(m == size-1)
				printf("N\n");
			else
				printf("Y\n");
			break;
		case 'a':
			if(n == 0)
				printf("N\n");
			else
				printf("Y\n");
			break;
		case 'd':
			if(n == size-1)
				printf("N\n");
			else
				printf("Y\n");
			break;
	}
	
	return 0;
}

4

题目描述

又一个迷宫
有一个迷宫,迷宫里有个人,迷宫的规格是N*N的方格,房内特定位置上有障碍物,人处于某一位置,可以选择上下左右方向前进,但是要保证面对的不是墙壁或障碍物,否则无法向前走

输入

迷宫的规格,一个正整数N(2<=N<=100),占一行,代表矩阵的大小;输入方形矩阵的N行N列,由0和1组成,其中0代表空地,1代表障碍物;输入一对数据m,n(第m行,第n列),表示人所在的位置坐标(保证人所在的位置为0,即空地),以空格隔开,占一行;输入一个整数表示要前进的方向,0,1,2,3分别代表左、下、右、上。

输出

”Y“
表示可以向该方向前进
”N“
表示可以向该方向前进
输出占一行

输入样例

4
1 0 0 0
1 1 1 0
0 0 1 0
1 0 0 1
0 3
1

输出

Y

参考代码

// 
// 由题意,m行n列起始地址都为0,在所处位置想要前进,必须要判断前进方向的障碍物是否为0,以及是否为边界
// 0向左前进,那么m不变,n-1列务必为0
// 1向下前进,那么m+1行务必为0,n行不变
// 2向右前进,那么m行不变,n+1列为0
// 3向上前进,那么m-1行务必为0,n行不变

#include <cstdio>


int main(){
	int size;			//迷宫规格
	scanf("%d", &size);
	int obstacle[size][size];	//障碍物矩阵
	int m, n;			//人所处位置图标
	int direction;				//前进方向
	
	/*下面循环将障碍物的矩阵输入保存*/
	for(int i = 0; i < size; i++)
		for(int j = 0; j < size; j++)
			scanf("%d", &obstacle[i][j]);
	
	scanf("%d%d", &m, &n);	
	
	
	/*判断输入的坐标所在位置是否为空地,若是输出错误信息*/
	if(obstacle[m][n] != 0){
		printf("输入位置存在障碍物!\n");
		return 0;
	}
	
	scanf("%d", &direction);
		
	switch(direction)
	{
		case 0:
			if(n == 0 || obstacle[m][n-1] != 0)
				printf("N\n");
			else
				printf("Y\n");
			break;
		case 1:
			if(m == size-1 || obstacle[m+1][n] != 0)
				printf("N\n");
			else
				printf("Y\n");
			break;
		case 2:
			if(n == size-1 || obstacle[m][n+1] != 0)
				printf("N\n");
			else
				printf("Y\n");
			break;
		case 3:
			if(m == 0 || obstacle[m-1][n] != 0)
				printf("N\n");
			else
				printf("Y\n");
			break;
	}
	
	return 0;
	
}

5

题目描述

字符串替换
输入三个字符串a,b,和c,将a中b的第一次出现替换为c

输入

输入三行,每行一个字符串,字符串长度不超过255;

输出

如果b有出现在a中,输出替换后的字符串,否则输出原串a。

输入样例

abcdefgh
cde
Xiaolan

输出

abXiaolanfgh

提示:所有字符串只包含英文字母

参考代码

// 思路:使用标准模板库STL的的string常用函数解决较为方便
// find()函数在字符串a中找出b第一次出现的位置,length()函数可得到b的字符串长度,replace根据前面所得位置即可替换为c

#include <iostream>
#include <string>
using namespace std;

int main(){
	string a, b, c;
	cin>>a;
	cin>>b;
	cin>>c;
	
	int m, n;		//分别表示b在a中第一次出现的位置和b的长度
	n = b.length();
	if(a.find(b) != string::npos)
		m = a.find(b);
	else{
		cout<<a<<endl;
		return 0;
	}
	
	cout<<a.replace(m, m+n-2, c)<<endl;
	
	return 0;
}

6

六码数问题
有点复杂,参考了他人的程序也觉得特别复杂,机试应该没有这么多时间折腾这个

7

已放弃

8

题目描述

给一行句子,写一个程序判断它有几个单词。

输入

输入占一行,行尾有空格,并且只含有大写字母和小写字母和空格

输出

单词的个数。
例如:
printf(" %d\n" ), num;

输入样例

General game players are systems able to

输出

7

参考代码

#include <cstdio>
#include <cstring>
const int maxn = 256;

int main(){
	int num = 1;
	char str[maxn];
	gets(str);
	
	for(int i = 1; i < strlen(str);i++)
		/*当前位置为空格,前一位置不为空格单词数+1*/
		if(str[i] == ' ' && str[i-1] != ' ')
			num++;
	printf("%d\n", num);
}

9

题目描述

因为连续的降雨,我们学校操场上出现了许多水坑,现在需要统计一共有 多少个水坑。
题目输入为一个N*M(1<=N<=100;1<=M<=100)的图,(‘W’ )代表积水, (’.’)代表干燥。
一处积水我们认为和它周围的八个方向相邻,
相邻的积水构成一个水坑。
需要输出一个数字,表示一共有多少个互不相邻的水坑。

输入

第一行:两个正整数n和m。
第二行到第n+1行:输入操场信息,每一点的状态只可能是’W’或者’.’

输出

输出一个正整数,表示不相邻的水坑的数目。

输入样例

(为观察方便,“.”显示为"。",输入时输入英文句号“.”)
10 12
W。。。。。。。。WW。
。WWW。。。。。WWW
。。。。WW。。。WW。
。。。。。。。。。WW。
。。。。。。。。。W。。
。。W。。。。。。W。。
。W。W。。。。。WW。
W。W。W。。。。。W。
。W。W。。。。。。W。
。。W。。。。。。。W。

输出

3

参考代码

#include <stdio.h>
#include <iostream>
using namespace std;
char map[100][100];//全局变量,表示一个二维字符矩阵
int visited[100][100];//全局变量,为0表示未访问过,1表示访问过
int ans=0;//全局变量,表示当前互不相邻水坑个数
int m,n;//全局变量,m和n
struct{//全局变量,结构体数组,表示八个方位的偏移量
    int x;
    int y;
}offset[8]={
    {-1,-1},
    {-1,0},
    {-1,1},
    {0,-1},
    {0,1},
    {1,-1},
    {1,0},
    {1,1}
};
void dfs(int i,int j)//深搜函数,表示对map[i][j]进行考察
{
    int x,y,u;//x和y用于暂时保存i和j改变之后的值,以免破坏原有i和j的值,u是循环变量
    visited[i][j]=1;//进来就访问,因此置1
    for(u=0;u<8;u++)//八个方向遍历
    {
        x=i+offset[u].x;//x改变
        y=j+offset[u].y;//y改变
        if(x>=0&&x<m&&y>=0&&y<n)//判断!这里是不允许越界的!
        {
            if(map[x][y]=='W'&&visited[x][y]==0)//只要找到一个未访问过的W,就基于该点考察!
                dfs(x,y);
        }
    }
}
int main()
{
    int i,j;
    scanf("%d %d",&m,&n);
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            visited[i][j]=0;
    getchar();//吸收上面的回车啦
    for(i=0;i<m-1;i++)//输入字符矩阵需要有技巧的哦!
    {
        for(j=0;j<n;j++)
            scanf("%c",&map[i][j]);
        getchar();
    }
    for(j=0;j<n;j++)
            scanf("%c",&map[m-1][j]);
    for(i=0;i<m;i++)//每个点都要遍历到
        for(j=0;j<n;j++)
        {
            if(map[i][j]=='W'&&visited[i][j]==0)//如果是未访问过的W,就要深搜,
            {
                dfs(i,j);
                ans++;//能执行到这里,说明上次深搜已经结束,已经找到全部的相邻的W了,即完成了一个水坑的查找
            }
        }
    printf("%d\n",ans);
    return 0;
}

转载自西工大:连阴雨问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值