Как обратиться к процедуре Step - C#
Формулировка задачи:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } void step(int s, int f, int p); private void button1_Click(object sender, EventArgs e) { int[,] map = new int[10, 10]; int[] road = new int[10]; bool[] incl = new bool[10]; int start, finish, len, c_len; bool found; // int p = 2; label1.Text=" "; for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { if (dataGridView1.Rows[i].Cells[j].Value != null) { map[i, j] = Convert.ToInt16(dataGridView1.Rows[i].Cells[j].Value); } else map[i, j] = 0; } } start = Convert.ToInt16(textBox2.Text); finish = Convert.ToInt16(textBox3.Text); road[1] = start; incl[start] = true; step(start,finish,2); if (!found) {label1.Text ="указанные точки не соединены!";} } void step(int s, int f, int p) { int[,] map = new int[10, 10]; int[] road = new int[10]; bool[] incl = new bool[10]; int start, finish, len, c_len; bool found; len = 0; c_len = 0; if (s == f) { len = c_len; found=true; for (int i = 1; i < p - 1; i++) { label1.Text = label1.Text + ' ' + Convert.ToInt16(road[i]); label1.Text = label1.Text + " , длина: " + Convert.ToInt16(len); } } else { for (int c = 1; c < 10; c++) { if ((map[s, c] != 0) && (!incl[c]) && ((len == 0) || (c_len + map[s, c] < len))) { road[p] = c; incl[c] = true; c_len = c_len + map[s, c]; step(c, f, p + 1); incl[c] = false; road[p] = 0; c_len = c_len - map[s, c]; } } } } }
Решение задачи: «Как обратиться к процедуре Step»
textual
Листинг программы
public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void button1_Click(object sender, EventArgs e) { int[,] map = new int[10, 10]; // карта int[] road = new int[10]; //дорога - номера точек карты bool[] incl = new bool[10]; // равен true если точка с номером i включена в road int start, finish; // начальная и конечная точки bool found; int len, c_len; // длина найденного(минимального) маршрута и текущего(формируемого) found = true; len = 0; // длина найденного(минимального) маршрута c_len = 0; // длина текущего маршрута label1.Text = " "; // ввод описания карты из таблицы for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { if (dataGridView1.Rows[i].Cells[j].Value != null) { map[i, j] = Convert.ToInt16(dataGridView1.Rows[i].Cells[j].Value); } else map[i, j] = 0; } } start = Convert.ToInt16(textBox2.Text); finish = Convert.ToInt16(textBox3.Text); road[1] = start; // внесём точку в маршрут incl[start] = true; // пометим её как включенную step(start, finish, 2,label1); // ищем вторую точку маршрута if (!found) { label1.Text = "указанные точки не соединены!"; } // проверяем, найден ли хоть один путь } // выбор очередной точки static void step(int s, int f, int p,Label l) { int[,] map = new int[10, 10]; int[] road = new int[10]; bool[] incl = new bool[10]; int start, finish, len, c_len; bool found; if (s == f) { len = c_len; // сохраняем длину найденного маршрута found = true; // вывод найденного маршрута for (int i = 1; i < p - 1; i++) { l.Text = l.Text + ' ' + Convert.ToInt16(road[i]); l.Text = l.Text + " , длина: " + Convert.ToInt16(len); } } else // выбираем очередную точку { for (int c = 1; c < 10; c++) // проверяем все вершины { if ((map[s, c] != 0) && (!incl[c]) && ((len == 0) || (c_len + map[s, c] < len))) //точка соединена с текущей, но не включена в маррут { road[p] = c; // добавим вершину в путь incl[c] = true; // пометим вершину как включённую c_len = c_len + map[s, c]; step(c, f, p + 1,l); incl[c] = false; road[p] = 0; c_len = c_len - map[s, c]; } } } } } }