2020北理工夏令营机试

题目:

1.

给你一个 m*n 大小的矩阵,每个点有 0,1,2 三种取值;0 代表障碍物,1代表白纸,2 代表墨滴。每一秒墨滴可以向其上下左右扩散,将四周的白纸染色,被染色之后的白纸可以继续向四周扩散,以此类推。问经过几秒,矩阵中所有的白纸都被染色。
如果可以,则输出扩散时间;
如果不可以,则输出FALSE。
输入: m n 的大小以及矩阵每个点的值
输出: 扩散时间 或 FALSE
例如:
3 3
0 1 0
1 2 1
0 1 0
输出: 1

写的有点繁琐了

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

struct point{
	int x,y;
	int time; //染成红色的时间 
	point(int x,int y,int time=0):x(x),y(y),time(time){}
};

queue<point> que;
int a[100][100];
int m,n;
int num1=0;

bool hefa(int x,int y)
{
	if(x>=0&&y>=0&&x<m&&y<n)
		return true;
	return false;
}
	
int ranse(int x,int y,int t)
{
	int time = t;
	if(hefa(x-1,y) && a[x-1][y] == 1){
		a[x-1][y] = 2;
		num1--;
		time = t+1;
		que.push(point(x-1,y,time));
	}
	if(hefa(x,y-1) && a[x][y-1] == 1){
		a[x][y-1] = 2;
		num1--;
		time=t+1;
		que.push(point(x,y-1,time));
	}
	if(hefa(x+1,y) && a[x+1][y] == 1){
		a[x+1][y] = 2;
		num1--;
		time=t+1;
		que.push(point(x+1,y,time));
	}
	if(hefa(x,y+1) && a[x][y+1] == 1){
		a[x][y+1] = 2;
		num1--;
		time=t+1;
		que.push(point(x,y+1,time));
	}
	return time;
}	
	
int bfs()
{
	int ans = 0;
	while(!que.empty()){
		point t = que.front();
		que.pop();
		ans = ranse(t.x,t.y,t.time);
	}
	if(num1 == 0)
		cout << ans << endl;
	else 
		cout << "FALSE" << endl;
}

int main()
{
	cin >> m >> n;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin >> a[i][j];
			if(a[i][j] == 2)
				que.push(point(i,j));
			if(a[i][j] == 1)
				num1++;
		}
	}
	bfs();			
} 

2.

输入三个字符串,问第三个字符串能否由前两个字符串多次重复组合形成。如果能,则输出前两个字符串各自的使用次数;如果不能,则输出 FALSE。
输入:三个字符串
输出:前两个字符串各自的次数 或 FALSE
输入: aa bb bbaaaabbaa
输出: 3 2
输入: ab ba abbaaabaab
输出: FALSE
(需要考虑拥有相同前缀的时候)

随手写了两个dfs,只有细微差别

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

string a,b,r;
int num1=0;
int num2=0;
bool flag = 0;

void dfs(string r)
{
	//cout << "dfs----string:" << r << " a=" << num1 << " b=" << num2 << endl;
	if(r.length()==0){
		cout << num1 << ' ' << num2 << endl;
		flag = 1;
		return;
	}
	int i = r.find(a);
	int j = r.find(b);
	if(i == 0){
		num1++;
		string rr = r.substr(a.length(),r.length()-a.length());
		dfs(rr);
		num1--;
	}
	if(j == 0){
		num2++;
		string rr = r.substr(b.length(),r.length()-b.length());
		dfs(rr);
		num2--;
	}
}

int main()
{//aa aab aaaabaaaabaabaa
	cin >> a >> b >> r;
	dfs(r); 
	if(!flag)
		cout << "FALSE" << endl;
}
#include<iostream>
#include<string>
using namespace std;

string a,b,r;
bool flag = 0;

void dfs(int num_a,int num_b,int start)
{
	//cout << "dfs----start=" << start << " a=" << num_a << " b=" << num_b << endl;
	if(start == r.length()){
		cout << num_a << ' ' << num_b << endl;
		return;
	}
	int i = r.find(a,start);
	int j = r.find(b,start);
	if(i == start)
		dfs(num_a+1, num_b, start+a.length());
	
	if(j == start)
		dfs(num_a, num_b+1, start+b.length());
	
}

int main()
{	//aa aab aaaabaaaabaabaa
	cin >> a >> b >> r;
	dfs(0,0,0);
	if(!flag)
		cout << "FALSE" << endl;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
北京理工大学微积分a期末试题2020-2021主要包含了微积分的基本概念、理论和应用。考题主要分为选择题和计算题两类,涵盖了微分、积分和微分方程等内容。 选择题方面,试题涉及了微积分的基本概念和性质,要求考生通过对概念和定理的理解和分析,选择正确的答案。例如,考题可能涉及导数的定义和性质,要求考生如实选出正确的选择项,并给出相关解释。 计算题方面,试题要求考生运用微积分的知识和技巧,进行计算和推导。例如,可能考察对给定函数进行求导、积分或求解微分方程等操作。这类题目要求考生严格按照微积分的计算规则和方法进行推导和计算,正确得出结果。 除了基本的微积分知识和技巧,试题还可能涉及到微积分的应用。例如,可能会提供一个实际问题的背景,要求考生利用微积分的方法对该问题进行分析和求解。这类题目要求考生能够将微积分理论与实际问题相结合,灵活运用所学知识解决实际问题。 总体而言,北京理工大学微积分a期末试题2020-2021主要考察了学生对微积分基本概念、理论和应用的理解和掌握能力。考生需要对微积分的理论知识进行熟练掌握,并能够将其应用于实际问题的求解中。备考时,建议结合平时的学习内容,进行反复巩固和练习,以保证自己对微积分的理解和应用能力的提升。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值