馬踏棋盤-----Java版
關於馬踏棋盤的思路,大致演算法如下:
1.貪心演算法(找最少的出路,因為最少的出路往往不用進行多次選擇,貪 心演算法的主要理念是:最拿走的路是最好的路);
2.深度搜索:主要的演算法是深入進去探索,但執行時間有點長,效率有點低,但搜尋面比較廣泛;
3.回溯:當搜尋到該點沒有出路時,就退回到上一個點的位置;
4.遞迴:馬踏棋盤主要用到是遞迴的方法,遞迴迴圈;
閒話不多說,來看看程式碼吧。。。。。
package ma;
import java.util.Scanner;
public class ma {
//馬在一個點時,能走的方向有8個;
static final int[] fx = {-1,-2,-2,-1,1,2,2,1};
static final int[] fy={2,1,-1,-2,-2,-1,1,2};
static final int N =8; //棋盤的大小;
static int[][] board = new int[N][N];//馬走的棋盤;
class manode{
int x; //x座標
int y; //y座標
int way; //該點有多少種走法;
} //定義一個內部類,馬所在點的資訊;
int wayout(int x,int y){
int tx,ty;
int count = 0;
if(x<0||y<0||x>=N||y>=N||board[x][y]>0){
return -1;
} //當點超出邊界或者所在的點的值不為0時,返回-1;
for(int i = 0;i<N;i++){
tx = x+fx[i];
ty = y+fy[i];
if (tx<0||ty<0||tx>=N||ty>=N){
continue;//如果點的另一個點超出邊界時,就continue;
}
if(board[tx][ty] == 0){
count++;//否則計數器計數;
}
}
return count;
}//計算該點的走法有多少種;
void sort(manode[] hn,int n){
int i,j,k;
manode temp; //臨時物件,用來排序交換;
for(i=0;i<n;i++){
for(k=i,j=i+1;j<n;j++){
if(hn[j].way<hn[k].way)
k=j;
}
if(k>i){
temp = hn[i];
hn[i] = hn[k];
hn[k] = temp;
}
}
}//將走法的數量進行排序,將最少的走法放在陣列的頭;
void dfs(int x,int y,int count){
int i,tx,ty;
manode[] t = new manode[N];
if(count >N*N){
output();
return;
} //當count計數器超過64時,列印輸出;
for(i=0;i<N;i++){
tx = x+fx[i];
ty = y+fy[i];
manode h = new manode();
t[i]=h;
t[i].x = tx;
t[i].y = ty;
t[i].way = wayout(tx,ty);
}
sort(t,N);
for(i = 0;t[i].way<0;i++)
;
for(;i<N;i++){
tx = t[i].x;
ty = t[i].y;
board[tx][ty] = count;
dfs(tx,ty,count+1);
board[tx][ty] = 0;//遇到死路時,回退回去,並將其變成0;
}
}//深度搜索與回溯演算法;
public static void main(String[] args) {
int x,y;
Scanner input = new Scanner(System.in);
System.out.println("please input x,y:");
x = input.nextInt();
y = input.nextInt();
ma test = new ma();
board[x][y]=1;
test.dfs(x, y, 2);
}
void output(){
for(int i = N-1;i>=0;i--){
for(int j = 0;j<N;j++){
System.out.printf("%d\t",board[i][j]);
}
System.out.printf("\n\n\n");
}
System.exit(0);
} //列印輸出函式;
}
that is all…end…..thank you….
相關推薦
馬踏棋盤-----Java版
關於馬踏棋盤的思路,大致演算法如下: 1.貪心演算法(找最少的出路,因為最少的出路往往不用進行多次選擇,貪 心演算法的主要理念是:最拿走的路是最好的路); 2.深度搜索:主要的演算法是深入進去探索,但執行時間有點長,效率有點低,但搜尋面比較廣泛; 3.回溯
java實現馬踏棋盤問題
並且 mov .... i++ pan 這一 初始化 count 調用 1.問題描述: 在國際象棋中,馬走日,用戶輸入棋盤的起始位置從1-8,輸出從這一點開始,馬走完整個棋盤的各個方案,並輸出方案數 2.輸入樣式: 請輸入棋盤馬的起始位置: 1 1 3
馬踏棋盤:貪心演算法java實現
import java.util.ArrayList; import java.util.LinkedList; class Horse { private boolean board[][] = new boolean[8][8];//棋盤 private Link
資料結構課後習題 馬踏棋盤 c語言版
馬踏棋盤 c語言版 輸入馬初始位置的座標。將初始位置進棧,經過一個while迴圈,取出符合條件的棧頂元素。 利用函式,找出棧頂元素周圍未被佔用的新位置,如果有,新位置入棧;否則彈出棧頂元素。再進行判斷,最後輸出。 將馬隨機放在國際象棋的8×8棋盤某個方格中
馬踏棋盤演算法 Java實現
馬在某個點最多可能有8種走法,用遞迴和回溯實現。 注:程式碼中,查詢下一個可走座標是從右下第一個開始的,也就是圖中的4。可以通過修改a,b...h的值來改變順序。 /** * 馬踏棋盤演算法 * 遞迴和回溯 * */ public class HorseStep
馬踏棋盤全部解
#include"stdio.h" int a[12][12]={0};//棋盤 int cut=0;//快取馬所走的步數 long count=0;//計算有多少種踏法 void horse(int x,int y); bool walk(int index,int *x,int
馬踏棋盤超簡潔遞迴80行完成
#include<stdio.h> #include<windows.h> #define MAX 8 #define NONE 0 #define START 1 int chess[MAX][MAX]; void initchess(); void traverche
馬踏棋盤(騎士周遊問題),深度優先搜尋
馬踏棋盤問題(又稱騎士周遊或騎士漫遊問題是演算法設計的經典問題之一)。問題描述:國際象棋的棋盤是8×8的方格棋盤,先將馬放在任意指定的方格中,按照馬走棋的規則將馬進行移動,要求每個方格只能進入一次,最終使得馬走遍棋盤的64個方格。除了邊緣的位置,馬每次有8種走法
馬踏棋盤,貪心演算法
由於回溯法實在是太耗費時間,所以利用貪心演算法進行了優化,在閱讀了網上關於貪心演算法怎麼用之後又除錯了很久,終於在上一個回溯法的基礎上寫出了優化的演算法,但是由於本人水平實在有限,程式碼或多或少還是有些問題,優化的可能還不夠。希望自己能繼續進步吧。 所謂貪心演算
馬踏棋盤優化
之前做了個深搜遍歷求解的方法,未優化,一個下午沒有結果,而且程式碼尚不夠精簡 看了一下優化方法,又重做了一個,基本不需要時間就能得到一個解 一共一百來行,沾沾自喜一下 #include<stdio.h> #include<windows.h>
馬踏棋盤問題
/*關於馬踏棋盤的基本過程:國際象棋的棋盤為 8*8 的方格棋盤。現將"馬"放在任意指定的方格中, 按照"馬"走棋的規則將"馬"進行移動。要求每個方格只能進入一次,最終使得"馬"走遍棋盤的64個方格。 */ #include <stdio.h> #include <time.h&g
馬踏棋盤(有問題的且不成熟的程式)
//將棋盤上的每個位置都走一遍 public class Mataqipan { public int zou(int position[][],int m,int n,int count){
馬踏棋盤演算法(騎士周遊問題)
一、馬踏棋盤演算法 1、國際象棋的棋盤為8*8的方格棋盤,將“馬”放在任意指定的方格中,按照“馬”走棋的規則將“馬”進行移動。要求每個方格只能進入一次,最終使得“馬”走遍棋盤64個方格。 2、關於國際象棋“馬”的走法:以“日”字為單位往斜對角上的那個方格走。如下圖所示馬在當
回溯演算法之馬踏棋盤
問題描述: 在8*8國際象棋棋盤上,讓馬從某一位置開始,走“日”子型踏遍棋盤每一個格子。 演算法思想: 採用回溯演算法,在每一個點上按照一定順序探查下一步的走法,若走不動,則回溯到上一
馬踏棋盤C++實現與貪婪演算法優化
馬踏棋盤問題即在一個8*8的棋盤上,指定一個起點,找到一個路徑,讓棋子按照馬走日的規則將所有格子無重複的遍歷一次。 這個問題是在學習資料結構與演算法的時候看到的,當時看的是C語言的版本,也沒記住具體的解法,事後回顧起來覺得很有意思,於是自己用C++編寫了一段程式碼嘗試一下
馬踏棋盤(6*6時效率不可忍受,求教!)
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #
馬踏棋盤(回溯演算法)
馬可以走的位置如圖: 要求: 找到所有馬從任意一個位置出發遍歷整個棋盤的一條路徑 演算法實現: #include<stdlib.h> #include<stdio.h&g
馬踏棋盤問題 — 深搜和貪心演算法
同學面試阿里,被問到了馬踏棋盤的問題,作為非計算機專業的門外漢,完全沒有聽說過,只聽說過馬踏飛燕。抓緊去搜了一下,發現還是個經典演算法,題目是這樣的: 國際象棋的棋盤為8*8的方格棋盤。現將”馬”放在任意指定的方格中,按照”馬”走棋的規則將”馬”進行移動。要求
馬踏棋盤的實現
(一)馬踏棋盤經典演算法描述: (1)馬踏棋盤是經典的程式設計問題之一,主要的解決方案有兩種:一種是基於深度優先搜尋的方法,另一種是基於貪婪演算法的方法。第一種基於深度優先搜尋的方法是比較常用的演算法,深度優先搜尋演算法也是資料結構中的經典演算法之一,主要是採用遞迴的思
馬踏棋盤C語言實現
該程式碼為未優化演算法實現,8*8棋盤,挑選效率高的起始點(2,0),以及效率高的走法 每一次走法的嘗試都是回溯法,一條路走到黑,直到行不通,再重新開始 ////////////////回溯法+遞迴//////////////圖的深度優先遍歷//////////////