函数返回错误的数字?

时间:2013-10-09 13:13:36

标签: c++ function breadth-first-search

有人可以帮我这个吗?它给了我一个错误的数字。 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;
}

3 个答案:

答案 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矩阵。