1. 程式人生 > >馬踏棋盤-----Java版

馬踏棋盤-----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),以及效率高的走法 每一次走法的嘗試都是回溯法,一條路走到黑,直到行不通,再重新開始 ////////////////回溯法+遞迴//////////////圖的深度優先遍歷//////////////