2013-10-09 4 views
0

아무도 도와 줄 수 있습니까? 그것은 나에게 잘못된 번호를 제공합니다. matrix [i] [j] .spath는 올바른 값으로 채워지지만 어떤 두 노드 사이의 최단 경로를 반환 할 때 잘못된 숫자를줍니다. 컴파일러는 나에게이함수가 잘못된 숫자를 반환합니까?

경고를 제공합니다 : 컨트롤이 void 이외의 기능

의 끝에 도달하지만 만약 문 제가 끝이 항상 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; 
} 
+1

출력이 어떻게 되겠습니까? 'shortest_path'가 돌아올 것이라고 생각합니까? –

+1

shortest_path (노드 시작, 노드 끝)의 끝에서 의미있는 것을 반환해야합니다. 처음부터 끝까지 경로가없는 경우 어떻게됩니까? (예 : cin은 mat [] []. val에 대해 0이 아닌 작은 대각선을 제공합니다.))? 그런 다음 정의되지 않은 값으로 shortest_path에서 빠져 나옵니다. – Tobias

+0

어떤 컴파일러/플랫폼을 사용하고 있습니까? g ++/linux를 사용하여 올바르게 작동하는 것 같습니다. – LeGEC

답변

0

:

귀하의 코드가 잘못된 입력에 대해 보호되지 않습니다 endn x m 그리드 밖에, 또는 "벽"에있는 경우, 또는 어떠한 경로에서이없는 경우 start to end 함수 return 문을 실행하지 않고 종료합니다.

컴파일러는 어떤 입력이 함수에 공급되는지 예측할 방법이 없습니다.

+0

5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.이 입력에 대해서는 문제가 없으므로이 입력에 대해 잘못된 출력을 제공한다는 점을 잊어 버렸습니다. 모든 두 노드 사이에 경로가 있고 좌표 4,4가 존재합니다. – LearningMath

+0

나를 위해 0을 계산해 주시겠습니까? – LeGEC

+0

5x5 행렬이므로 25 제로입니다. 편집 : Windows 7에서 gnu 컴파일러를 사용 중입니다. – LearningMath

0

눈치 챘 겠지만 문제는 return 문이 누락 된 것입니다. if 문에서 항상 리턴을 거치지 만 컴파일러는 그렇지 않다는 것을 알 수 있으므로 경고합니다. 입력이 정확하다고 가정했지만 사용자 입력을 신뢰하지 않아야합니다. 절대로.

void가 아닌 함수에서 실행될 수있는 모든 경로에 대해 항상 return 문을 사용해야합니다.

+0

이 입력에 대해 잘못된 출력을 제공한다는 것을 잊어 버렸습니다 : 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.그래서 모든 것이이 입력으로 괜찮습니다. 모든 두 노드 사이에 경로가 있고 좌표 4,4가 있습니다. – LearningMath

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> = 5m> = 5 때문에 엔드 포인트는 (4,4). 및 n * m 매트릭스.

관련 문제