http://tjuacm.chaosheng.top/problem.php?id=1268
原来我的写法,能过样例,但WA
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 110;
int matrix[N][N];
bool vis[N][N];
int row[4] = {1, 0, -1, 0};
int col[4] = {0, -1, 0, 1};
struct node{
int i, j;
vector<vector<int> > path;
};
vector<vector<int> > bfs(){
queue<node> q;
node f;
f.i = 0;
f.j = 0;
f.path.push_back({0, 0});
q.push(f);
vis[f.i][f.j] = true;
while(!q.empty()){
f = q.front();
q.pop();
//满足条件
if(f.i == 4 && f.j == 4){
return f.path;
}
node v; //新的状态
for(int i = 0; i < 4; i++){
v.i = f.i + row[i];
v.j = f.j + col[i];
if(!vis[v.i][v.j] && matrix[v.i][v.j] != 1){
vis[v.i][v.j] = true;
vector<vector<int> > tmp = f.path;
tmp.push_back({v.i, v.j});
v.path = tmp;
q.push(v);
}
}
}
//return NULL;
}
int main(){
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
cin >> matrix[i][j];
}
}
memset(vis, false, sizeof(vis));
vector<vector<int> > ans = bfs();
for(int i = 0; i < ans.size(); i++){
printf("(%d, %d)\n", ans[i][0], ans[i][1]);
}
return 0;
}参考 https://www.cnblogs.com/veasky/p/10989259.html
思路没有错,改了存path的方法,AC
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int, int> P;
int matrix[5][5];
bool vis[5][5];
int row[4] = {1, 0, -1, 0};
int col[4] = {0, 1, 0, -1};
struct node{
int x, y;
//vector<vector<int> > path;
int flag; //指示path最后一个位置
P path[100];
};
void bfs(){
queue<node> q;
node f;
f.x = 0;
f.y = 0;
f.flag = 0;
f.path[f.flag] = P(0, 0);
q.push(f);
vis[f.x][f.y] = true;
while(q.size()){
f = q.front();
q.pop();
//满足条件
if(f.x == 4 && f.y == 4){
for(int i = 0; i <= f.flag; i++){
printf("(%d, %d)\n",f.path[i].first, f.path[i].second);
}
return ;
}
for(int i = 0; i < 4; i++){
node v = f;
v.x = f.x + row[i];
v.y = f.y + col[i];
v.flag++;
if(v.x >= 0 && v.x < 5 && v.y >= 0 && v.y < 5 && !vis[v.x][v.y] && matrix[v.x][v.y] == 0){
vis[v.x][v.y] = true;
v.path[v.flag] = P(v.x, v.y);
q.push(v);
}
}
}
}
int main(){
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
cin >> matrix[i][j];
}
}
memset(vis, false, sizeof(vis));
bfs();
return 0;
}不死心又改了原来的,但是RuntimeError
应该是打印path出了问题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int matrix[5][5];
bool vis[5][5];
int row[4] = {1, 0, -1, 0};
int col[4] = {0, 1, 0, -1};
struct node{
int x, y;
vector<vector<int> > path;
};
void bfs(){
queue<node> q;
node f;
f.x = 0;
f.y = 0;
f.path.push_back({0, 0});
q.push(f);
vis[f.x][f.y] = true;
while(q.size()){
f = q.front();
q.pop();
//满足条件
if(f.x == 4 && f.y == 4){
for(int i = 0; i < f.path.size(); ++i){
printf("(%d, %d)\n", f.path[i][0], f.path[i][1]);
}
return ;
}
for(int i = 0; i < 4; i++){
node v = f;
v.x = f.x + row[i];
v.y = f.y + col[i];
if(v.x >= 0 && v.x < 5 && v.y >= 0 && v.y < 5 && !vis[v.x][v.y] && matrix[v.x][v.y] == 0){
vis[v.x][v.y] = true;
v.path.push_back({v.x, v.y});
q.push(v);
}
}
}
}
int main(){
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
cin >> matrix[i][j];
}
}
memset(vis, false, sizeof(vis));
bfs();
return 0;
}
京公网安备 11010502036488号