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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值