有人可以帮我这个吗?它给了我一个错误的数字。 matrix [i] [j] .spath填充了正确的值,但是当我返回任意两个节点之间的最短路径时,它给出了一个错误的数字。编译器给了我这个
警告:控制到达非空函数的结尾
但是我检查是否到达结尾的if语句将始终执行return语句,因为我在main()中设置了结束坐标。但是我注意到当我添加返回1或在函数末尾返回任何内容时它会给出正确的结果。这是一种规则还是什么?我写了一个这样的函数,我有一个if语句和唯一的return语句,它没有问题。谢谢:))
#include <iostream>
#include <queue>
using namespace std;
struct node
{
int x,y,spath,val;
}v,c;
node mat[100][100];
int dy[] = {-1,1,0,0}, dx[] = {0,0,-1,1}, n, m;
void input()
{
cin >> n >> m;
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
cin >> mat[i][j].val;
mat[i][j].spath = 0;
}
}
}
int shortest_path(node start, node end)
{
queue<node> q;
q.push(start);
mat[start.y][start.x].val = 1;
while (!q.empty())
{
v = q.front();
q.pop();
for (int i=0; i<4; i++) {
c.y = v.y + dy[i];
c.x = v.x + dx[i];
if (c.y == end.y && c.x == end.x) {
return mat[v.y][v.x].spath + 1;
}
else if (c.y >=0 && c.y < n && c.x >=0 && c.x < m && mat[c.y][c.x].val == 0)
{
mat[c.y][c.x].val = 1;
mat[c.y][c.x].spath = mat[v.y][v.x].spath + 1;
q.push(c);
}
}
}
}
int main()
{
node start,end;
start.x = start.y = 0;
end.y = end.x = 4;
input();
cout << shortest_path(start,end) << endl;
return 0;
}
答案 0 :(得分:0)
关于警告:
您的代码未受到错误输入的保护:如果end
位于n x m
网格之外,或位于“墙上”,或者start
到{end
之间没有路径{1}}你的函数将退出而不执行return语句。
编译器无法预测输入到函数的输入。
答案 1 :(得分:0)
正如您所注意到的,问题是它错过了一个return语句。您可能知道它将始终通过if语句中的返回,但编译器不会,因此警告。 你认为输入是正确的,但你应该“永远不要相信用户输入”。永远不能。
执行可能在非空函数中执行的所有路由都应该有一个return语句。
答案 2 :(得分:0)
好像你正在写BFS.Here是我的代码:
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
#define N 200
int n,m;
int move[][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct node
{
node(int _x=0,int _y=0)
{
x=_x,y=_y;
}
int x,y; //mark the Coord of the node
};
int data[N][N];//store data.
bool map[N][N]; //mark whether the node is visited.
int input()//input & initialize the array
{
memset(map,false,sizeof(map));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
int t;
scanf("%d",&t);
data[i][j]=t;
map[i][j]=false;
}
return 0;
}
bool judge(node x)
{
if(x.x<n&&x.x>=0&&x.y<m&&x.y>=0) return true;
return false;
}
int shortest_path(node s,node e)
{
queue<int>dist;//means 'spath' in your code.
int dst=0;
queue<node>q;
q.push(s);
map[s.x][s.y]=true;
dist.push(0);
node v,c;
while(!q.empty())
{
v=q.front();
q.pop();
dst=dist.front();
dist.pop();
for(int i=0;i<4;i++)
{
c.x=v.x+move[i][0];
c.y=v.y+move[i][1];
if(judge(c)&&!map[c.x][c.y])
{
dist.push(dst+1);
q.push(c);
map[c.x][c.y]=true;
if(c.x==e.x&&c.y==e.y)
return dst+1;
}
}
}
return -1;//if the path not found return -1;
};
int main()
{
input();
node s(0,0),e(4,4);
printf("%d\n",shortest_path(s,e));
return 0;
}
输入应该是: n> = 5 m> = 5,因为终点是(4,4)。 和一个n * m矩阵。