题目描述:
公司的程序员不够用了,决定把产品经理都转变为程序员以解决开发时间长的问题。
在给定的矩形网格中,每个单元格可以有以下三个值之一:
- 值0代表空单元格;
- 值1代表产品经理;
- 值2代表程序员;
每分钟,任何与程序员(在4个正方向上)相邻的产品经理都会变成程序员。
返回直到单元格中没有产品经理为止所必须经过的最小分钟数。
如果不可能,返回-1。
以下是一个4分钟转变完成的示例:
2 1 1 2 2 1 2 2 2 2 2 2 2 2 2
1 1 0 -> 2 1 0 -> 2 2 0 -> 2 2 0 -> 2 2 0
0 1 1 0 1 1 0 1 1 0 2 1 0 2 2
输入格式
不固定多行(行数不超过10),毎行是按照空格分割的数字(不固定,毎行数字个数不超过10)。
其中每个数组项的取值仅为0、1、2三种。
读取时可以按行读取,直到读取到空行为止,再对读取的所有行做转换处理。
输出格式
如果能够将所有产品经理变成程序员,则输出最小的分钟数。
如果不能够将所有的产品经理变成程序员,则返回-1.
输入样例:
0 2
1 0
输出样例:
-1
输入样例:
1 2 1
1 1 0
0 1 1
输出样例:
3
思路:使用bfs
1、因为是宽搜,将每次增加的节点存放在queue中
2、首先将值为2的节点加入,然后遍历值为2 的节点,加入队列,并设置dis为0
3、然后遍历值为2的节点相邻的节点且值为1的节点,将节点加入队列,然后将dis更新为上次的dis+1
4、最后判断dis[m][n]这个二维数组中是否有存在-1且给定矩阵中值为1出现,若有,返回-1
5、否则,返回dis矩阵中的最大值
#include<iostream>
#include<algorithm>
#include<queue>
#include<sstream>
#include<cstring>
using namespace std;
//定义queue插入的pair
typedef pair<int,int> PII;
const int N = 15;
int n = 0,m = 0;
int dis[N][N];
int g[N][N];
int bfs(){
queue <PII> que;
//memset函数引用cstring头文件
memset(dis,-1,sizeof dis);
//将程序员加入到队列中并且dis赋值为0
for(int i = 0; i < n; i++ )
for(int j = 0; j < m; j++ ){
if(g[i][j] == 2){
dis[i][j] = 0;
que.push({i,j});
}
}
//在队列进行宽搜
int dx[4] = {0,0,1,-1},dy[4] = {-1,1,0,0};
while(que.size()){
auto t = que.front();
que.pop();
int a = t.first, b = t.second, d = dis[a][b];
for(int i = 0; i < 4; i++){
int x = a + dx[i], y = b + dy[i];
if(x>=0 && x< n && y < m && y >= 0 && g[x][y] == 1 && dis[x][y] == -1){
dis[x][y] = d + 1;
que.push({x,y});
}
}
}
int res = 0;
for(int i = 0; i < n; i++ )
for(int j = 0; j < m; j++){
if(g[i][j] == 1){
if(dis[i][j] == -1)return -1;
else res =max(res,dis[i][j]);
}
}
return res;
}
int main(){
//使用流输入
string line;
while(getline(cin,line)){
int k = 0;
stringstream ssin(line);
while(ssin >> g[n][k])k++;
m = k;
n++;
}
cout<<bfs()<<endl;
return 0;
}
372

被折叠的 条评论
为什么被折叠?



