Tim duong trong me cung

Một phần của tài liệu Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# Tập 1 - Chương 6 pptx (Trang 26 - 28)

s: dinh xuat phat t: dinh ket.

Tim duong trong me cung

Tim duong trong me cung (Thuat toan Soi chi Arian) s: dinh xuat phat

t: dinh ket. ---*) ---*) procedure MC; tự viết BEGIN MC; write(nl,'fini'); END.

Với thí dụ đã cho trong đề bài, bạn hãy chạy thử chương trình MECUNG.PAS với hai dữ liệu kiểm thử, một dữ liệu kiểm thử có nghiệm và một dữ liệu kiểm thử vô nghiệm.

Chú ý

Đường đi tìm được không phải là đường ngắn nhất. Trong chương 7 ta sẽ dùng thuật giải Dijkstra để tìm đường đi ngắn nhất.

// C#using System; using System; using System.IO; namespace SangTaoT1 { /*--- * Tim duong trong me cung * ---*/ class MeCung

{

static string fn = "MeCung.INP"; static string gn = "MeCung.OUT";

static int mn = 200; // So dinh toi da static int[] v; // vet duong di

static int[] d;// dinh dang xet static int[,] c; // ma tran ke 0/1 static int n = 0; // So dinh

static int s = 0; // Dinh xuat phat static int t = 0; // Dinh ket static int k = 0; // buoc duyet

static void Main() {

Doc(); Show(); Ghi(MC()); // Doc lai de kiem tra

Console.WriteLine("\n Kiem tra"); Console.WriteLine("\n Input: \n"); Console.WriteLine(File.ReadAllText(fn)); Console.WriteLine("\n Output: "); Console.WriteLine(File.ReadAllText(gn)); Console.WriteLine("\n Fini "); Console.ReadLine(); } // Main

static void Doc() {

int[] a = Array.ConvertAll(

((File.ReadAllText(fn)).Trim()). Split(new char[] { ' ', '\n', '\r', '\t', '\0' }, StringSplitOptions.RemoveEmptyEntries), new Converter<String, int>(int.Parse)); n = a[0]; // so dinh

s = a[1]; // dinh xuat phat t = a[2]; // dinh ket t = a[2]; // dinh ket

c = new int[n + 1, n + 1]; // c ma tran ke // c ma tran ke

v = new int[n + 1]; // vet duong di d = new int[n + 1]; d = new int[n + 1];

// d[i] = 1: da tham dinh i k = 2;

for (int i = 1; i <= n; ++i) {

c[i, i] = 0;

for (int j = i + 1; j <= n; ++j) c[i, j] = c[j,i] = a[++k]; }

}

// Hien thi de kiem tra // thu tuc doc du lieu static void Show() {

Console.WriteLine("\n" + n + " " + s + " " + t); for (int i = 1; i <= n; ++i)

{ Console.WriteLine(); Console.WriteLine(); for (int j = 1; j <= n; ++j) Console.Write(c[i, j] + " "); } }

static void Ghi(bool Ket) {

StreamWriter f = File.CreateText(gn); if (Ket) // co nghiem

{

f.WriteLine(k);

for (int i = 1; i <= k; ++i) f.Write(v[i] + " "); }

else f.WriteLine(0);// vo nghiem f.Close(); } static bool MC() { Array.Clear(v, 0, v.Length); Array.Clear(v, 0, v.Length); k = 1; // Buoc duyet v[k] = s; d[s] = 1; // danh dau phong da den int phong = 0;

do {

if (v[k] == t)

return true; // den dich if (k < 1)

return false; // het cach if ((phong = Tim()) > 0) { // Tien them 1 buoc // nha chi, danh dau

v[++k] = phong; d[phong] = 1; }

else --k; // lui } while (true); }

// Tu phong v[k] tim duoc //mot duong sang phong khac static int Tim()

{

for (int j = 1; j <= n; ++j)

if (d[j] == 0)// phong j chua tham if (c[v[k], j] > 0)

//co hanh lang toi j return j;

return 0; }

} // MeCung } // SangTao1

Một phần của tài liệu Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# Tập 1 - Chương 6 pptx (Trang 26 - 28)

Tải bản đầy đủ (PDF)

(28 trang)