初始狀態的步數就算1,哈哈
輸入:第乙個3*3的矩陣是原始狀態,第二個3*3的矩陣是目標狀態。
輸出:移動所用最少的步數
input
2 8 3
1 6 4
7 0 5
1 2 3
8 0 4
7 6 5
output
注意:題目中 0的位置是可以移動的空格。
分析:首先題目要求求最少的步數,很容易想到使用bfs ;
那麼對於bfs,我們要解決的主要問題是要確定每一步的狀態並儲存給下次使用。
結合bfs模板考慮,首先每次移動的結果是每一步的狀態,並且每次狀態我們需要儲存的資訊有:矩陣的排序,空格的位置以及步數,所以以此為依據設計結構體;
注意到,如果要設定標記陣列的話,因為每次狀態下是乙個陣列,所以是否步方便,而該題的陣列是3*3的,就算是有重複計算的狀態,時間也是可以接受的,所以這裡沒有採取標記陣列,只是簡單的處理,保證不往後走。
struct node node;
int x[4] = ;
int y[4] = ;
int matrix[3][3], final[3][3];
bool judge(int x, int y)
bool same(int a[3][3])
}return true;
}int bfs(int x, int y)
}q.push(node);
while(!q.empty())
}int tmp;
tmp = node.m[newx][newy];
node.m[top.x][top.y] = tmp;
node.m[newx][newy] = 0;
if(same(node.m))
q.push(node);
}
}
}return -1;
}int main()}}
for(int i = 0; i < 3; i++)
}cout << bfs(x, y) << endl;
}
參考鏈結 問題 C 寬搜入門 8數碼難題
時間限制 20 sec 記憶體限制 128 mb 提交 193 解決 69 提交 狀態 討論版 命題人 外部匯入 初始狀態的步數就算1,哈哈 輸入 第乙個3 3的矩陣是原始狀態,第二個3 3的矩陣是目標狀態。輸出 移動所用最少的步數 input 2 8 3 1 6 4 7 0 5 1 2 3 8 0...
5997 Problem C 寬搜入門 8數碼難題
時間限制 20 sec 記憶體限制 128 mb 提交 85 解決 26 提交 狀態 討論版 命題人 外部匯入 初始狀態的步數就算1,哈哈 輸入 第乙個3 3的矩陣是原始狀態,第二個3 3的矩陣是目標狀態。輸出 移動所用最少的步數 input 2 8 3 1 6 4 7 0 5 1 2 3 8 0 ...
8數碼問題 深搜 廣搜
8數碼問題的廣搜在網上可以找到 廣搜一般可以找到最優解,但是深搜不一定能找到最優解。一般的深搜多是指定最大遞迴深度的深搜,一般情況下,問題解的深度很難確定。因此深蒐會出現三種情況,一是找到最優解,二是在迭代深度內找不到解,三是找到解但不是最優解。第一種情況自然是最好的,不過較經常出現的是第三種,在指...