题目:
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;
}