每天刷個演算法題20160523:騎士巡遊的遞迴轉非遞迴解法
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
http://blog.csdn.net/xiaofei_it/article/details/51524728
為了防止思維僵化,每天刷個演算法題。已經刷了幾天了,現在發點程式碼。
我已經建了一個開源專案,每天的題目都在裡面:
https://github.com/Xiaofei-it/Algorithms
絕大部分演算法都是我自己寫的,沒有參考網上通用程式碼。讀者可能會覺得有的程式碼晦澀難懂,因為那是我自己的理解。
最近幾天都是在寫一些原來的東西,大多數是非遞迴。以後準備刷點DP、貪心之類的題。
下面是騎士巡遊的遞迴轉非遞迴解法。
/**
*
* Copyright 2016 Xiaofei
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package xiaofei.algorithm;
import java.util.Stack;
/**
* Created by Xiaofei on 16/5/23.
*/
public class KnightCruise {
//8好像特別慢,我考慮剪枝,但狀態太多,64的64次方,加上節點位置,不知道怎麼剪。我記得原來用Pascal都沒這麼慢啊。
private static final int SIZE = 6;
private static int[][] board = new int[SIZE][SIZE];
private static int[] dx = new int[]{-1, 1, 2, 2, 1, -1, -2, -2};
private static int[] dy = new int[]{-2, -2, -1, 1, 2, 2, 1, -1};
private static void clear() {
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
board[i][j] = 0;
}
}
}
private static void output() {
System.out.println();
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
if (board[i][j] < 10) {
System.out.print(" " + board[i][j]);
} else {
System.out.print(" " + board[i][j]);
}
}
System.out.println();
}
}
private static boolean solveRecursively(int x, int y, int step) {
if (step == SIZE * SIZE) {
output();
return true;
}
for (int i = 0; i < 8; ++i) {
int nextX = x + dx[i];
int nextY = y + dy[i];
if (nextX >= 0 && nextX < SIZE && nextY >=0 && nextY < SIZE && board[nextX][nextY] == 0) {
board[nextX][nextY] = step + 1;
if (solveRecursively(nextX, nextY, step + 1)) {
return true;
} else {
board[nextX][nextY] = 0;
}
}
}
return false;
}
private static void solveCorecursively(int x, int y) {
class Element {
int x;
int y;
int step;
int index;
Element(int x, int y, int step) {
this.x = x;
this.y = y;
this.step = step;
this.index = -1;
}
}
Stack<Element> stack = new Stack<>();
stack.push(new Element(x, y, 1));
board[x][y] = 1;
while (!stack.isEmpty()) {
Element element = stack.peek();
if (element.step == SIZE * SIZE) {
output();
return;
} else {
int nextX, nextY;
if (element.index >= 0) {
nextX = element.x + dx[element.index];
nextY = element.y + dy[element.index];
board[nextX][nextY] = 0;
}
while (++element.index < 8) {
nextX = element.x + dx[element.index];
nextY = element.y + dy[element.index];
if (nextX >= 0 && nextX < SIZE && nextY >= 0 && nextY < SIZE && board[nextX][nextY] == 0) {
board[nextX][nextY] = element.step + 1;
stack.push(new Element(nextX, nextY, element.step + 1));
break;
}
}
if (element.index == 8) {
stack.pop();
}
}
}
}
public static void solve(boolean recursive) {
if (recursive) {
clear();
board[0][0] = 1;
solveRecursively(0, 0, 1);
} else {
clear();
solveCorecursively(0, 0);
}
}
}
相關文章
- 每天刷個演算法題20160525:快速排序的遞迴轉非遞迴解法演算法排序遞迴
- 每天刷個演算法題20160524:阿克曼函式的遞迴轉非遞迴解法演算法函式遞迴
- 每天刷個演算法題20160521:二叉樹高度(遞迴與非遞迴)演算法二叉樹遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 遞迴演算法轉換為非遞迴演算法的技巧遞迴演算法
- 快速排序【遞迴】【非遞迴】排序遞迴
- 每天刷個演算法題20160518:非遞迴二叉樹遍歷演算法遞迴二叉樹
- Python 八皇后解法(非遞迴版本)Python遞迴
- 快速排序(遞迴及非遞迴演算法原始碼)排序遞迴演算法原始碼
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 資料結構與演算法——歸併排序: 陣列&連結串列&遞迴&非遞迴解法全家桶資料結構演算法排序陣列遞迴
- 漢諾塔非遞迴演算法遞迴演算法
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 五大演算法程式碼模板(DFS 遞迴非遞迴都算上,是六個)演算法遞迴
- 馬踏棋盤演算法(騎士周遊問題)----遞迴與貪心優化演算法演算法遞迴優化
- 【演算法拾遺】二分查詢遞迴非遞迴實現演算法遞迴
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- C#中漢諾塔問題的遞迴解法C#遞迴
- Vue3.0的遞迴監聽和非遞迴監聽Vue遞迴
- 二十一、氣泡排序演算法——JAVA實現(遞迴與非遞迴)排序演算法Java遞迴
- 遞迴轉非遞迴 棧模擬 Recursive to Non-recursive stack simulated 總結遞迴
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- 遞迴和尾遞迴遞迴
- 氣泡排序、快速排序(遞迴&非遞迴)、堆排序演算法比較淺析排序遞迴演算法
- 演算法小專欄:遞迴與尾遞迴演算法遞迴
- 遞迴演算法遞迴演算法
- 遞迴演算法程式設計整數因子分解問題的遞迴演算法遞迴演算法程式設計
- 為什麼你學不會遞迴?刷題幾個月,告別遞迴,談談我的經驗遞迴
- Java遍歷資料夾的兩種方法(非遞迴和遞迴)Java遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二分法的簡單實現——-遞迴和非遞迴遞迴