【情景再現】
文字描述太晦澀,不直觀,請看下面視頻:
情景再現視頻
【提出問題】
那麼怎麼樣的排序能實現以上的結果呢?
【解決問題】
【方法一】計算機程序窮舉
選擇java實現,下面是代碼:
package com.company.pk3;
import java.util.Stack;
public class Game {
private Stack<Integer> stk = new Stack<>();
private Stack<Integer> final_rank = new Stack<>();
private Stack<Integer> final_stack = new Stack<>();
private Stack<Integer> out_rank = new Stack<>();
private int[] num1 = {1,2,3,4,5,6};
private int[] num2 = {7,8,9,10,11,12,13};
private int count=0;
private void merge(Stack<Integer> stk){ //將7-13插入到1-6中形成排列
for (int i = 0; i < 13 ; i++) {
try {
final_rank.add(stk.get(i));
final_rank.add(num1[i]);
} catch (Exception e) {
// e.printStackTrace();
break;
}
}
}
private void check(){ //檢查是否符合視頻中的邏輯
String s;
s = final_rank.toString();
while (!final_rank.isEmpty()) {
final_rank.push(final_rank.get(0));//第一個拿到最後一個
final_rank.remove(0);
out_rank.add(final_rank.get(0));//將要翻出的牌放到這個stack中
final_rank.remove(0);
}
// System.out.println("輸出序列>>"+out_rank);
if (out_rank.toString().equals(final_stack.toString())){//和1-13一樣,表示找到了方案
System.out.println("the solutions has been found>>" + s);//找到輸出即可
}
else {
final_rank.clear();
out_rank.clear();
}
}
private void select(int position){
if (7 == position){
// System.out.println(stk);
merge(stk); //合併數組
// System.out.println("最終排序"+final_rank);
check();
count +=1;
return;
}
for (int i = 0; i < num2.length; i++) {
if (stk.contains(num2[i])){
continue;
}
stk.add(num2[i]);
select(position+1);
stk.pop();
}
}
public void start_run(){
select(0);
// System.out.println("一共"+count+"種。");
}
public static void main(String[] args) {
Game game = new Game();
for (int i = 1; i <= 13; i++) {
game.final_stack.add(i);
}//生成1-13目標的序列
game.start_run();
}
}
運行結果如下:
the solutions has been found>>[7, 1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10]
按照這個順序排列撲克牌,便可以實現視頻中的情景。
優點:不用費腦子,順着情景去窮舉
缺點:本次情景是1到k的撲克牌,要是實現1-5000的也滿足這種邏輯的排序呢?很明顯在進行排列組合的時候就會增加很多運行時間,效率低下。
【方法二】逆向思維快速解決
不知道,大家聰明的腦袋瓜有沒有意識到,如果我們逆向思考,那麼這個問題將會變得很簡單!
我使用AE將視頻倒放,大家看效果!
逆向思維
這樣要實現1-5000的排序也就不難了。
代碼有人感興趣再發吧。