1. 程式人生 > >課程設計——中國象棋中的跳馬問題

課程設計——中國象棋中的跳馬問題

此題是一個搜尋題,可用DFS或BFS,建議選擇BFS(廣搜)。一開始把馬的起始點加入佇列,然後用廣搜的思想把此點能到達的其他點加入佇列,這裡需要一個數組用來記錄此點在之前是否已經加入佇列,如果加入過隊列當中,就不需要再加入了,直到佇列裡的元素為空,或者搜尋到了終點,搜尋即停止,然後輸出相應答案即可。
參考程式碼如下:

#include<stdio.h>
#define MAX 150
#define SIZE 10201
#define OK 1
//馬下一步最多能跳的地方的個數
#define  M  8
//馬可能跳的位置的相對橫縱座標,上、右、下、左 
int Movex[M] = {-1,1,  2, 2,   1,-1,  -2,-2};
int Movey[M] = { 2,2,  1,-1,  -2,-2,  -1,1};

//馬跳的時候最多遇到的障礙數
#define  B  4
//馬的障礙的位置的相對總橫座標,上、右、下、左
int Barx[B] = {0,1,0,-1};
int Bary[B] = {1,0,-1,0};

typedef struct 
{
    int step;//記錄步數
int flag;//標記
}Chessboard;//棋盤型別

typedef struct
{
int lnum;
int rnum;//記錄元素下標
}Queue;//佇列型別

Queue queue[SIZE];//佇列
int rear,front;//佇列指標
Chessboard board[MAX][MAX];

int a,b,c,d,row,line;//起點,終點座標以及行列值


int BFS()
{
    int x0,y0;
int mx,my,bx,by;
int i;
rear=-1;
front=-1;//佇列指標初始化
board[a][b].step=0;//起點的步數記為0
board[a][b].flag=1;//起點標記已經進過佇列
    rear++;
queue[rear].lnum=a;
queue[rear].rnum=b;//起點先進佇列
while(front!=rear)//佇列不為空
{
        front++;
x0=queue[front].lnum;
y0=queue[front].rnum;//出佇列
if(x0==c && y0==d)  return OK;//找到了終點就停止搜尋
for(i=0;i<M;i++)//m=8,共有八個地方可以跳
{
          //算出值,利用該值來判斷向該方向跳是否有障礙物阻礙
bx = x0+Barx[i/2];
by = y0+Bary[i/2];//用來判斷是否有障礙物
//算出值,利用該值來判斷向該方向上日字的端點處是否有障礙物或已走過
//即下一位置的座標
mx = x0 + Movex[i];
my = y0 + Movey[i];
if(board[bx][by].flag!=-1)
{
                if(mx>0&&mx<=row && my>0&&my<=line && !board[mx][my].flag)//不能越界,board[mx][my].flag必為0
{
rear++;
                    queue[rear].lnum=mx;
                    queue[rear].rnum=my;//進佇列  
board[mx][my].flag=1;//標記為已經走過
board[mx][my].step=board[x0][y0].step+1;//路徑值是其根部的路徑值加1
}//if
}//if
}//for
}//while
 return 0;
}


int main()
{
int n,m,e,f;
int k,i,j;
scanf("%d",&n);//一共n組測試資料
for(k=0;k<n;k++)
{
scanf("%d %d",&row,&line);//輸入棋盤大小 行列
      for(i=1;i<=row;i++)
for(j=1;j<=line;j++)
board[i][j].flag=0;//初始化,全部標記為0
 scanf("%d %d %d %d",&a,&b,&c,&d);//輸入起點終點座標值
   scanf("%d",&m);//m個障礙
      for(i=0;i<m;i++)
  {
   scanf("%d %d",&e,&f);
   board[e][f].flag=-1;//障礙點標記為-1
  }
 if(BFS())
      printf("%d\n",board[c][d].step);
      else  printf("can not reach!\n");
}
return 0;
}


相關推薦

課程設計——中國象棋跳馬問題

此題是一個搜尋題,可用DFS或BFS,建議選擇BFS(廣搜)。一開始把馬的起始點加入佇列,然後用廣搜的思想把此點能到達的其他點加入佇列,這裡需要一個數組用來記錄此點在之前是否已經加入佇列,如果加入過隊列當中,就不需要再加入了,直到佇列裡的元素為空,或者搜尋到了終點,搜尋即停止,然後輸出相應答案即可。參考

中國象棋跳馬問題

題目描述 現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物(限制馬的行動,與象棋走法相同) 輸入 第一行輸入n表示有n組測試資料。 每組測試資料第一行輸入2個整數p,q,表示棋盤的大小(1<=p,q<=100)。 每組測試資料第二行輸

BFS:中國象棋跳馬問題

問題描述是這樣的: 有一張p*q的棋盤,並且棋盤中有障礙物(用來限制馬的行動,即中國象棋中的蹩馬腿)。有一個棋子馬(走“日”字形路線),要從起始點走到終點。 輸入部分: 第一行輸入一個整數n,表示有n組測試例項,每組測試資料第一行輸入兩個整數p和q,表示棋盤的大小(1&l

團隊-中國象棋遊戲-設計文檔

象棋 div 不同 目標 變化 自己的 成員 註意 同時 成員:張明成 張洪劍 張鴻程 趙建輝 徐宏璇 喻政博 目標:1.繪制象棋棋盤 2.在指定位置繪制棋子 3.各棋子按規則行子。馬跳“日”字、象走“

團隊-團隊編程項目中國象棋-代碼設計規範

項目 ctype utf-8 之間 char 寫入 特殊情況 script 類型 html書寫規範 1. 文檔類型聲明及編碼: 統一為html5聲明類型<!DOCTYPE html>; 編碼統一為<meta charset=”gbk” />, 書寫時

中國象棋程式的設計與實現 一 專案截圖

                上週一發表了,中國象棋程式的設計與實現(原始版)(包含原始碼) ,在一週的時間裡,有22次下載,700次訪問,還是挺讓我欣喜的。 本週和下週,將陸續發表中國象棋程式的設計與實現(高階版),包括 專案截圖,畢業論文,架構圖,開發日誌記錄,演算法設計等,更重要的是 專案的原始碼。簡

Java課程設計:捕獲圖片以及識別圖的文字

lean 方式 最簡 文件名 println otf jpeg robot nap 本人承接各種高校C語言、C++、Java語言等課程設計以及ppt等制造,有需要的私信我或者微信18476275715 屏幕捕捉工具 要求: 用圖形用戶界面實現。 能實現捕捉屏幕上的圖片、文字

中國象棋對局軟體設計(一)

以下依模式設計,完成的中國象棋的設計草稿(一) 整個對局程式由主控類TChessPlayCtrl控制。首先初始化棋局的初態,包括棋局初態(ChessState)、兩個棋手(CPlayer)、棋手之間傳遞的訊息(Mesg),然後進入主控程式,決定首先走棋方THEPLAYER:

中國象棋程式的設計與實現(四)-- 一次“流產”的寫書計劃

 1.寫書緣由2010年寫完中國象棋程式(程式碼)後,我想認真完善下這個專案。在寫程式碼過程中,我已經加入了大量的註釋。寫完後,我開始撰寫相關文件。由於自己讀的是軟體工程專業,所以我想把需求分析、架構設計、詳細設計、測試等文件都認真地寫一下。認真的說,我確實都寫了。在細化文件

中國象棋程式的設計與實現(八)-如何構造一個棋子(車馬炮等)

本篇詳細介紹,在中國象棋程式中,如何構造一個棋子。1.棋子類的定義。 public class ChessPiece extends JLabel 棋子是一個繼承自JLabel的圖形介面元件,當新增到棋盤中的時候,看起來比較美觀。      2.棋子類的屬性。/*

匯編課程設計

cal add dword sta bsp 定義 codes 格式化 click assume cs:codesg,ss:stack data segment db ‘1975‘,‘1976‘,‘1977‘,‘1978‘,‘1979‘,‘198

課程設計 問題 R: 自來水管道

i++ class 間接 color 應該 表示 數組 == 課程 題目描述 你領到了一個鋪設校園內自來水管道的任務。校園內有若幹需要供水的點,每兩個供水點可能存在多種鋪設路徑。對於每一種鋪設路徑,其成本是預知的。 任務要求最終鋪設的管道保證任意兩點可以

Android課程設計第二天界面排版

fit span widget mipmap only get pro 其他 orien 註意:課程設計只為完成任務,不做細節描述~ 老師叫我們做一個這個樣子,然後.. 1 <?xml version="1.0" encoding="utf-8"?>

軟件工程課程設計指導隨筆

求學 課程設計 測試 沒有 收獲 業務 加工 詳細講解 課程 本學期帶14信息01班的《軟件工程課程設計》,已經進入了尾聲。 兩周的課程設計,要求學生完成一個多角色的智能菜單系統,課程設計的任務是要求根據不同角色控制訪問每個菜單項的權限,用戶允許有多個角色;角色和用戶都可以

Android課程設計第四天ListView運用

cnblogs super ces getc clas odin long sad tools 註意:課程設計只為完成任務,不做細節描述~ 效果圖 1 <?xml version="1.0" encoding="utf-8"?> 2 <Relat

Android課程設計第五天歡迎界面(滑動)

col color oncreate apt cli ctsc star .cn ges 註意:課程設計只為完成任務,不做細節描述~ 滑動界面 1 package com.example.myapplication; 2 3 import android

會場安排課程設計

while all got gin 開始時間 gree std 數組 n) 給一些活動,要求分配會場。 #include<stdio.h>#include<stdlib.h>int greedySelector(int *s,int *f,int l

動態規劃 BZOJ1801 [Ahoi2009]chess 中國象棋

vtp size bom hint sizeof ecg 然而 cda 中國象棋 1801: [Ahoi2009]chess 中國象棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1861 Solved: 1068[Su

bzoj 1801: [Ahoi2009]chess 中國象棋

std stream 一個數 space 兩個 blog mat 多少 並且 Description 在N行M列的棋盤上,放若幹個炮可以是0個,使得沒有任何一個炮可以攻擊另一個炮。 請問有多少種放置方法,中國像棋中炮的行走方式大家應該很清楚吧. Input 一行包含兩個整數

洛谷 P3650 [USACO1.3]滑雪課程設計Ski Course Design

scanf sign nbsp 整數 單位 std sig inline 說明 題目描述 農民約翰的農場裏有N座山峰(1<=N<=1000),每座山都有一個在0到100之間的整數的海拔高度。在冬天,因為山上有豐富的積雪,約翰經常開辦滑雪訓練營。 不幸的是,約翰剛