百度之星試題每周一練


百度之星,是全球最大的中文搜索引擎,百度公司面向中國高校學生和編程愛好者所舉辦的高水平的程序設計大賽。他所考試的題目,全部都是算法的題目。

鄙人雖然是一個.net程序員,在工作之余,喜愛算法。 這個問題非常的巧,故而分享給大家,我想到一種超簡單方法,提供大家,希望對大家起了一個開闊思路的作用。

首先,題意是這樣的:

八方塊移動游戲要求從一個含 8 個數字 (用 1-8 表示) 的方塊以及一個空格方塊 (用 0 表示) 的 3x3 矩陣的起始狀態開始,不斷移動該空格方塊以使其和相鄰的方塊互換,直至達到所定義的目標狀態。空格方塊在中間位置時有上、下、左、右 4 個方向可移動,在四個角落上有 2 個方向可移動,在其他位置上有3 個方向可移動。例如,假設一個 3x3 矩陣的初始狀態為: 

8 0 3
2 1 4
7 6 5

目標狀態為: 

1 2 3
8 0 4
7 6 5

則一個合法的移動路徑為:

8 0 3 8 1 3 8 1 3 2 1 3 1 2 3

2 1 4 => 2 0 4 => 8 0 4 => 8 0 4 

7 6 5 7 6 5 7 6 5 7 6 5 7 6 5 7 6 5

另外,在所有可能的從初始狀態到目標狀態的移動路徑中,步數最少的路徑被稱為最短路徑;在上面的例子中,最短路徑為 3 。如果不存在從初試狀態到目標狀態的任何路徑,則稱該組狀態無解。 請設計有效的(細節請見評分規則)算法找到從八方塊的某初試狀態到某目標狀態的所有可能路徑中的最短路徑,並用源代碼實現。
輸入數據:
程序需讀入已被命名為 start.txt 的初始狀態和已被命名為 goal.txt 的目標狀態,這兩個文件都由 9 個數字組成( 0 表示空格, 1-8 表示 8 個數字方塊),每行 3 個數字,數字之間用空格隔開。
輸出數據:
如果輸入數據有解,輸出一個表示最短路徑的非負的整數;如果輸入數據無解,輸出 -1 。
自測用例:
如果輸入為: start.txt 和 goal.txt ,則產生的輸出應為:

又例,如果用
7 8 4
3 5 6
1 0 2
替換 start.txt 中的內容,則產生的輸出應為:
17

對於這道題,我思考的思路是這樣子的

把每個0-8 的數字,等價於相應橫坐標與橫坐標的格式例如用一個詞典的格式為{7,"0-0"},{8,"0-1"},{4,“0-2”}把兩個詞典鍵相等的值,在比較於i,j的值。

相應偽代碼如下:

基於這樣的思路我們寫出的源代碼如下所示了:

 1 int[,] a1 = new int[3,3]
 2                             {
 3                                 {7 ,8, 4 },
 4                                 {3, 5, 6 },
 5                                 {1, 0, 2} 
 6                             };
 7             int[,] bInts = new int[3,3]
 8                                {
 9                                    {1 ,2 ,3},  
10                                    {8 ,0 ,4}, 
11                                    {7, 6, 5}
12                                };
13             int count = 0;
14          
15             count = 0;
16             Dictionary<int, string> aList = new Dictionary<int, string>();
17             Dictionary<int, string> bList = new Dictionary<int, string>();
18             for (int i = 0; i < 3; i++)
19             {
20                 for (int j = 0; j < 3; j++)
21                 {
22                     aList.Add(a1[i,j], i.ToString() + "-" + j.ToString());
23                     bList.Add(bInts[i,j], i.ToString() + "-" + j.ToString());
24                     Console.WriteLine();
25 
26                     count++;
27 
28                 }
29                 Console.WriteLine();
30             }
31             int sum = 0;
32             for (int i = 0; i < 8; i++)
33             {
34                 string aS = aList[i];
35                 string bS = bList[i];
36 
37                 sum = sum + Math.Abs(Convert.ToInt32(aS.Split('-')[0]) - Convert.ToInt32(bS.Split('-')[0]));
38                 sum = sum + Math.Abs(Convert.ToInt32(aS.Split('-')[1]) - Convert.ToInt32(bS.Split('-')[1]));
39             }
40             Console.WriteLine(sum+ 1);
41             Console.ReadKey();

這樣的思想可能從數學角度得以證明,但純編程角度,沒有深入實質,再就是任何變化,都有解。。。。。。。。。。。這是為何?懇請網友們斧正,最好給出正派解法。我這是旁門左道。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM