Как убежать из нескольких циклов сразу в C#?

Что, если у меня есть вложенные циклы, и я хочу убежать из всех них сразу?

while (true) {
    // ...
    while (shouldCont) {
        // ...
        while (shouldGo) {
            // ...
            if (timeToStop) {
                break; // Break out of everything?
            }
        }
    }
}

В PHP, break берет аргумент в пользу количества циклов для убегания. Что-то вроде этого может быть сделано в C#?

Что относительно чего-то отвратительного, как goto?

// In the innermost loop
goto BREAK
// ...
BREAK: break; break; break;
64
задан Peter Mortensen 21 August 2015 в 18:29
поделиться

3 ответа

У вас есть график здесь, где все доступные шаги связаны (value=1), и недоступные шаги разъединены (value=0), редкая матрица была бы похожа:

(a1,b3)=1,
(a1,c2)=1,
  .....

И кратчайший путь двух пунктов на графике может быть найден, используя http://Псевдокодекс en.wikipedia.org/wiki/Dijkstra's_algorithm

со страницы Википедии:

function Dijkstra(Graph, source):
   for each vertex v in Graph:           // Initializations
       dist[v] := infinity               // Unknown distance function from source to v
       previous[v] := undefined          // Previous node in optimal path from source
   dist[source] := 0                     // Distance from source to source
   Q := the set of all nodes in Graph
   // All nodes in the graph are unoptimized - thus are in Q
   while Q is not empty:                 // The main loop
       u := vertex in Q with smallest dist[]
       if dist[u] = infinity:
          break                         // all remaining vertices are inaccessible from source
       remove u from Q
       for each neighbor v of u:         // where v has not yet been removed from Q.
           alt := dist[u] + dist_between(u, v) 
           if alt < dist[v]:             // Relax (u,v,a)
               dist[v] := alt
               previous[v] := u
   return dist[]

ОТРЕДАКТИРУЙТЕ:

  1. как идиот, сказало использование Алгоритм http://en.wikipedia.org/wiki/A * _ может быть быстрее.
  2. самый быстрый путь, для предварительного расчета всех расстояний и сохраните его в полной матрице 8x8. Ну, я бы назвал это жульничеством, и работает только потому, что проблема мал. Но иногда соревнования проверит, насколько быстро ваша программа бежит.
  3. Главное, что если вы готовитесь для конкурса на программирование, вы должны знать общие алгоритмы, включая алгоритмы Dijkstra. Хорошей отправной точкой является чтение Введение в алгоритмы ISBN 0-262-03384-4. Или вы можете попробовать википедию, http://en.wikipedia.org/wiki/List_of_algorithms
-121--785925-

Goto только отвратительно, когда злоупотребляют. Чтобы выбыть из самого внутреннего цикла некоторых гнездовий, это приемлемо. НО... надо спросить, почему там в первую очередь так много гнездится.

Краткий ответ: Нет.

-121--924979-

Извлеките вложенные циклы в функцию, а затем используйте возврат, чтобы выйти из цикла из любого места, а не разорвать.

81
ответ дан 24 November 2019 в 15:42
поделиться

Введите еще один контрольный флаг и поместите его во все ваши вложенные условия while, как показано ниже. Также заменяет имеющееся у вас условие while (true) на это

bool keepLooping = true;
while (keepLooping) {
    // ...
    while (shouldCont && keepLooping) {
        // ...
        while (shouldGo && keepLooping) {
            // ...
            if (timeToStop) { 
                keepLooping  = false;
                break; // break out of everything?
            }
        }  
    }
}
65
ответ дан 24 November 2019 в 15:42
поделиться

Гото ужасен только тогда, когда им злоупотребляют. Допускается выпадение из самого внутреннего цикла некоторой вложенности. НО ... нужно спросить, почему там вообще так много гнездовий.

Краткий ответ: Нет.

27
ответ дан 24 November 2019 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: