Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2018, 17:49   #1
Georgii98
Пользователь
 
Регистрация: 02.12.2016
Сообщений: 11
По умолчанию Перевод кода из С++ в С#

Доброго времени суток
Прошу помочь с переводом кода с С++ в C#. У самого не получилось, на С++ она выполняет верно, а моя реализация в С# нет.
Код:
const int maxn = 100;                //максимум городов
int n, i, s, min, _count, found;        //n-количество городов
									   //i-счетчик
									   //s-текущая сумма
									   //min-минимальная сумма
									   //count-счетчик пройденных городов
									   //found-найден ли город
int a[maxn][maxn];                //матрица рассояний
int m[maxn], minm[maxn];            //m-текущий путь
void _input()                    //ввод данных
{
	ifstream fin("input.txt");     //открыли файл
	fin >> n;                        //считали n
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			fin >> a[i][j];                //считали матрицу расстояний
}
//minm-минимальный путь
void _output()                    //вывод данных
{
	ofstream fout("output.txt");   //открыли файл
	if (found)                        //если найден маршрут...
	{
		fout << "Lenght of min path = " << min << endl;
		fout << "Path : ";
		int c = 1;                    //номер в порядке обхода городов
		for (int i = 1; i <= n; i++)      //пробегаем по всем городам
		{
			int j = 1;
			while ((j <= n) &&                //ищем следующий город в порядке обхода    
				(minm[j] != c)) j++;
			fout << j << "->";
			c++;
		}
		fout << minm[1] << endl;    //обход завершается первым городом
	}
	else fout << "Path not found!";
}
void search(int x)                //поиск следующего города в порядке 
								  //обхода после города с номером Х
{
	if ((_count == n) &&                //если просмотрели все города
		(a[x][1] != 0) &&                //из последнего города есть путь в первый город
		(s + a[x][1]<min))            //новая сумма расстояний меньше минимальной суммы
	{
		found = 1;                    //маршрут найден
		min = s + a[x][1];                //изменяем: новая минимальная сумма расстояний
		for (int i = 1; i <= n; i++)minm[i] = m[i];//изменяем: новый минимальный путь
	}
	else
	{
		for (int i = 1; i <= n; i++)     //из текущего города просматриваем все города
			if ((i != x) &&                //новый город не совпадает с текущим    
				(a[x][i] != 0) &&            //есть прямой путь из x в i
				(m[i] == 0) &&            //новый город еще не простотрен
				(s + a[x][i]<min))    //текущая сумма не превышает минимальной
			{
				s += a[x][i];                //наращиваем сумму
				_count++;                //количество просмотренных городав
				m[i] = _count;                //отмечаем у нового города новый номер в порядке обхода
				search(i);                //поиск нового города начиная с города i
				m[i] = 0;                    //возвращаем все назад
				_count--;                //-"-
				s -= a[x][i];                //-"-
			}
	}
}
void run()
{                                //инициализация                                
	s = 0;
	found = 0;
	min = 32767;
	for (int i = 1; i <= n; i++) m[i] = 0;
	_count = 1;
	m[1] = _count;                        //считаем что поиск начинается с первого города
	search(1);                        //считаем что поиск начинается с первого города
}

int main()
{
	_input();                        //ввод данных
	run();                            //запуск основного алгоритма
	_output();                        //вывод результатов
    return 0;
}
Буду благодарен любой подсказке или предложению.
Georgii98 вне форума Ответить с цитированием
Старый 08.06.2018, 18:00   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Та оно и на С++ выглядит не корректным...начать с индексов массивов - с какой целью у вас циклы от 1 ? Нумерация начинается с 0. Т.е. первый (с номером 0) вы из каких-то соображений не пользуете или просто пофиг?)
Ну и потом, а что будет при 100 городах или 101 ?
alexzk вне форума Ответить с цитированием
Старый 08.06.2018, 18:10   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Какой пофиг, если он до n включительно ходит. Просто не знает.
p51x вне форума Ответить с цитированием
Старый 08.06.2018, 18:21   #4
Georgii98
Пользователь
 
Регистрация: 02.12.2016
Сообщений: 11
По умолчанию

alexzk и p51x, это не мой код на С++, я его взят, т.к. он решает задачу коммивояжера замкнутую(начинает всегда с 1 города). И пытаюсь её на C# переделать, так что ответов я не знаю, почему он с 1 идёт. Но это не влияет на правильность ответа, если в С++.
p51x, я знаю, что он включительно идёт. Повторюсь, реализация не моя, я просто пытаюсь её переделать.
Код:
static int n, i, s, min, _count, found, start;
       static int[,] a;
       static int[] m, minm;
        static void output()
        {
            if (found==1)                        //если найден маршрут...
            {
                Console.Write("Lenght of min path = "+ min+Environment.NewLine);
                Console.Write( "Path : ");
                //int c = 0;                    //номер в порядке обхода городов
                for (int i = 0; i < n; i++)      //пробегаем по всем городам
                {
                    //int j = 0;
                    // while ((j <= n) &&                //ищем следующий город в порядке обхода    
                    // (minm[j] != c))
                    //{
                    // j++;
                    //Console.Write(j.ToString() + "->");
                    //  }
                    // c++;
                    Console.Write(minm[i].ToString() + "->");
                }
                Console.Write(Convert.ToString(minm[0]));    //обход завершается первым городом
            }
            else Console.WriteLine("Path not found!");
        }
        static void search(int x)                //поиск следующего города в порядке                                           //обхода после города с номером Х
        {

            if ((_count == n) &&                //если просмотрели все города
                (a[x,0] != 0) &&                //из последнего города есть путь в первый город
                (s + a[x,0] < min))            //новая сумма расстояний меньше минимальной суммы
            {
                found = 1;                    //маршрут найден
                min = s + a[x,0];                //изменяем: новая минимальная сумма расстояний
                for (int i = 0; i < n; i++) minm[i] = m[i];//изменяем: новый минимальный путь
            }
            else
            {
                for (int i = 0; i < n; i++)     //из текущего города просматриваем все города
                    if ((i != x) &&                //новый город не совпадает с текущим    
                        (a[x,i] != 0) &&            //есть прямой путь из x в i
                        (m[i] == 0) &&            //новый город еще не простотрен
                        (s + a[x,i] < min))    //текущая сумма не превышает минимальной
                    {
                        s += a[x,i];                //наращиваем сумму
                        _count++;                //количество просмотренных городав
                        m[i] = _count;                //отмечаем у нового города новый номер в порядке обхода
                        search(i);                //поиск нового города начиная с города i
                        m[i] = 0;                    //возвращаем все назад
                        _count--;                //-"-
                        s -= a[x,i];                //-"-
                    }
            }
        }
        static void run()
        {
            m = new int[n];
            minm = new int[n];
            s = 0;
            found = 0;
            min = 32767;
            for (int i = 0; i < n; i++) m[i] = 0;
            _count = 0;
            m[0] = _count;                        //считаем что поиск начинается с первого города
            search(1);

        }
        static void Main(string[] args)
        {
            n = 3;
            a = new int[n, n];
            a[0, 0] = 0;
            a[0, 1] = 1;
            a[0, 2] = 1;
            a[1, 0] = 1;
            a[1, 1] = 0;
            a[1, 2] = 1;
            a[2, 0] = 1;
            a[2, 1] = 0;
            a[2, 2] = 1;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j <n; j++)
                {
                    
                    Console.WriteLine("{0,3}", a[i, j]);
                }
                Console.WriteLine();
            }
            run();
            output();
            Console.ReadKey();

            
        }
Вот, что у меня пока вышло, вроде путь правильный, но лишний раз суммирует. Пытаюсь, сделать в общем, чтобы можно было, т.е. любого города начать обход.

Последний раз редактировалось Georgii98; 08.06.2018 в 18:31.
Georgii98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод кода из C# в C++ mnb Помощь студентам 0 18.05.2017 23:14
перевод кода q123ser87 Помощь студентам 3 05.06.2012 15:35
перевод кода из С++ в С# PROkaZZZniK C# (си шарп) 3 14.11.2011 18:12
Перевод кода zmey31313 Фриланс 1 01.01.2010 21:49