C-код для ветвления и связанного выпуска

Так что я думаю, что я на правильном пути, используя метод ветвления и привязки для решения моего эвристического решения задачи о путешествии, однако, я получаю ошибку сегментации в своей "наименьшей" функции, но мне все еще трудно справиться со своей задачей вокруг алгоритма. Любая помощь, исправляющая это, очень ценилась бы. В основном требования к функции (потому что моя основная функция выглядит забавно) состоят в том, что программа должна занимать до 150 городов, и если она читается менее чем за 60 секунд, я получаю бонусные баллы (что означает, что я не ошибаюсь), входной файл будет выглядеть например (например): c 1 c 2 a 1 2 300 Где "c" означает "создать город", а "a" означает "добавить границу". вот почему моя программа настроена так, как она есть.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cost=0;
int main(){
int numcity ,a[151][151],visited[151],worthless,city1,city2,distance;
char citystring[2];
  a[1][1]=0;
  while(scanf("%s",citystring) != EOF){
  if(strcmp(citystring, "c") == 0){
    scanf("%d", &worthless);
    numcity++;
    }
  else if(strcmp(citystring, "a") == 0){
    scanf("%d %d %d",&city1,&city2,&distance);
    a[city1][city2] = distance;
    a[city2][city1] = distance;
    }
  }
  mincost(1,numcity,a,visited);
  printf("The minimum cost tour is %d",cost);

  return 0;
}

int mincost(int city,int n,int a[151][151],int visited[151]){
int i,ncity;
  visited[city]=1;
  printf("%d->",city);
  ncity=least(city,n,a,visited);
  if(ncity==999999){
    ncity=1;
    printf("%d",ncity);
    cost+=a[city][ncity];
  }
  mincost(ncity,n,a,visited);
}

int least(int c,int n,int a[151][151],int visited[10]){
int i,nc=999999,min=999999,kmin;
  for(i=1;i<=n;i++){
    if((a[c][i]!=0)&&(visited[i]==0)){
      if(a[c][i]<min){
        min=a[i][1]+a[c][i];
        kmin=a[c][i];
        nc=i;
      }
    }
  }
  if(min!=999999)
    cost+=kmin;
    return nc;
}

2 ответа

Массивы C индексируются 0, но ваш индекс идет от 1..n вместо 0..(n-1) ... поэтому вы объявили 151 вместо 150?

Но ваш сбой, вероятно, из-за того, что mincost называет себя безоговорочно. Вы говорите, что думаете, что находитесь на правильном пути, но испытываете затруднения, обдумывая алгоритм... Я думаю, что эти утверждения противоречивы. Вы должны быть уверены, что понимаете алгоритм, прежде чем пытаться его кодировать.

Ядро вашей программы выгружает последнюю строку mincost(), которая является рекурсивным вызовом mincost().

причина сбоя в том, что вы дуете (переполняете) стек.

У вас есть рекурсивный эквивалент бесконечного цикла.

Когда должна быть возвращена минимальная стоимость?

Другие вопросы по тегам