Функция возвращает неправильный номер?

Кто-нибудь может мне помочь с этим? Это дает мне неправильный номер. Матрица [i] [j] .spath заполнена правильными значениями, но когда я возвращаю кратчайший путь между любыми двумя узлами, это дает мне неправильное число. Компилятор дает мне это

предупреждение: управление достигает конца не пустой функции

Но оператор if, где я проверяю, достигнут ли конец, всегда будет выполнять оператор return, потому что я установил конечные координаты в main (). Но я заметил, что когда я добавляю return 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

Решение

Как вы заметили, проблема в том, что он пропускает оператор return. Возможно, вы знаете, что он всегда будет проходить через возврат в операторе if, но компилятор этого не делает, отсюда и предупреждение.
Вы предполагали, что ввод был правильным, но вы никогда не должны доверять вводу пользователя. Никогда и никогда.

Всегда должен быть оператор возврата для всех маршрутов, которые может выполнить выполнение в вашей не-void функции.

0

Другие решения

Кажется, вы пишете BFS. Вот мой код:

#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 м> = 5, потому что конечной точкой является (4,4).
и матрица n * m.

0

О предупреждении:

Ваш код не защищен от неправильного ввода: если end находится за пределами вашего n x m сетка, или находится на «стене», или если нет пути от start в end ваша функция будут выйти без выполнения оператора возврата.

Компилятор не может предсказать, какие входные данные будут переданы в функцию.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector