OD跳马
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<climits>
using namespace std;
vector<vector<int>> checknum = { {1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,-1},{-2,1} };
void bfs(vector<vector<int>>& board, vector<vector<int>>& numofhourse, vector<vector<int>>& stepnum,int n,int m){
int maxstep = board[n][m];
int step = 0;
queue<pair<int, int>> que;
que.push({ n,m });
vector<vector<bool>> checkboard(board.size(), vector<bool>(board[0].size(), 0));
while (!que.empty() && step < maxstep) {
int size = que.size();
for (int i = 0; i < size; i++) {
int x = que.front().first;
int y = que.front().second;
que.pop();
stepnum[x][y] += step;
numofhourse[x][y]++;
checkboard[x][y] = 1;
for (int j = 0; j < checknum.size(); j++) {
int nx = x + checknum[j][0];
int ny = y + checknum[j][1];
if (nx >= 0 && nx < board.size() && ny >= 0 && ny < board[0].size() && checkboard[nx][ny] == 0) {
checkboard[nx][ny] = 1;
que.push({ nx,ny });
}
}
}
step++;
}
}
int main() {
int row, col;
cin >> row >> col;
vector<vector<int>> board(row, vector<int>(col, 0));
vector<vector<int>> numofhourse = board;
vector<vector<int>> stepnum(row, vector<int>(col, 0));
int counthourse = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
string temp;
cin >> temp;
if (temp != ".") {
board[i][j] = stoi(temp);
counthourse++;
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] > 0) {
bfs(board, numofhourse, stepnum, i, j);
}
}
}
int minstep = INT_MAX;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (numofhourse[i][j] == counthourse) {
if (stepnum[i][j] < minstep) {
minstep = stepnum[i][j];
}
}
}
}
if (minstep == INT_MAX) {
cout << "0";
}
else {
cout << minstep;
}
return 0;
}
#include<vector>
#include<string>
#include<queue>
#include<climits>
using namespace std;
vector<vector<int>> checknum = { {1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,-1},{-2,1} };
void bfs(vector<vector<int>>& board, vector<vector<int>>& numofhourse, vector<vector<int>>& stepnum,int n,int m){
int maxstep = board[n][m];
int step = 0;
queue<pair<int, int>> que;
que.push({ n,m });
vector<vector<bool>> checkboard(board.size(), vector<bool>(board[0].size(), 0));
while (!que.empty() && step < maxstep) {
int size = que.size();
for (int i = 0; i < size; i++) {
int x = que.front().first;
int y = que.front().second;
que.pop();
stepnum[x][y] += step;
numofhourse[x][y]++;
checkboard[x][y] = 1;
for (int j = 0; j < checknum.size(); j++) {
int nx = x + checknum[j][0];
int ny = y + checknum[j][1];
if (nx >= 0 && nx < board.size() && ny >= 0 && ny < board[0].size() && checkboard[nx][ny] == 0) {
checkboard[nx][ny] = 1;
que.push({ nx,ny });
}
}
}
step++;
}
}
int main() {
int row, col;
cin >> row >> col;
vector<vector<int>> board(row, vector<int>(col, 0));
vector<vector<int>> numofhourse = board;
vector<vector<int>> stepnum(row, vector<int>(col, 0));
int counthourse = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
string temp;
cin >> temp;
if (temp != ".") {
board[i][j] = stoi(temp);
counthourse++;
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] > 0) {
bfs(board, numofhourse, stepnum, i, j);
}
}
}
int minstep = INT_MAX;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (numofhourse[i][j] == counthourse) {
if (stepnum[i][j] < minstep) {
minstep = stepnum[i][j];
}
}
}
}
if (minstep == INT_MAX) {
cout << "0";
}
else {
cout << minstep;
}
return 0;
}
全部评论
bfs里面分别是 每个马初始化一个bool数组来计算该马走过的 ;一个全局计数二维数组来计算能到达这个点的马的数量 ;一个全局二维数组来累计计算所有马到达这个点的步数 最后记录马的数量为所有数量的点的步数为结果,如果马的数量记录小于总的马数就说明没有点
相关推荐
点赞 评论 收藏
分享