欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++基于棧的深搜算法實現(xiàn)馬踏棋盤

 更新時間:2022年02月15日 10:38:02   作者:coder_vivid  
這篇文章主要為大家詳細(xì)介紹了C++基于棧的深搜算法實現(xiàn)馬踏棋盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

馬踏棋盤(基于棧的深搜算法實現(xiàn))

簡單來說,從任意指定方格出發(fā),為馬尋找一條走遍棋盤每一格并且只經(jīng)過一次的一條路徑,這就是馬踏棋盤的簡單描述。

話不多說,代碼如下,要是有什么不懂的地方,歡迎討論~

#include <stdio.h>
#include <stdlib.h>
#define M 8 //行
#define N 8 //列
?
typedef struct snode?? ?//坐標(biāo)
{
?? ?int flag;
?? ?int x;
?? ?int y;
}stack;
typedef struct node?? ??? ?
{
?? ?int top;?? ?//記錄走了多少步top+1
?? ?int flag; ?//記錄上一步走的方向
?? ?stack * p;?? ?//路徑棧
}LNode;
?
LNode * CreateStacke();?? ??? ?//創(chuàng)建,并初始化
void Judge(LNode * s, int chess[][N]); //判斷往哪走
void Push(LNode * s, stack x); ?//入棧操作
void Pop(LNode * s); //出棧操作
int IsFull(LNode * s); //判滿
int IsEmpty(LNode * s); //判空?
int main()
{
?? ?int chess[M][N] = {0};?? ??? ?//棋盤
?? ?int i, j; ?//循環(huán)變量
?? ?LNode * step;?? ??? ??? ??? ??? ?//step存的是走的路徑
?? ?
?? ?step = CreateStacke();
?? ?
?? ?Judge(step, chess);
?
?? ?for (i = 0; i < N; i++){
?? ??? ?for (j = 0; j < M; j++){
?? ??? ??? ?printf("%2d ", chess[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
?
?? ?return 0;
}
LNode * CreateStacke()
{
?? ?LNode * s = (LNode *)malloc(sizeof(LNode));
?? ?
?? ?if (!s){
?? ??? ?printf("內(nèi)存空間不足!\n");
?? ??? ?system("pause");
?? ??? ?exit(0);
?? ?}
?? ?s->p = (stack *)malloc(sizeof(stack) * M * N);
?? ?if (!s->p){
?? ??? ?printf("內(nèi)存空間不足!\n");
?? ??? ?system("pause");
?? ??? ?exit(0);
?? ?}
?? ?s->top = -1;?? ?// 把top放在棧底
?? ?return s;
}
void Judge(LNode * s, int chess[][N])?? ??? ?
{
?? ?int ch[8][2] = {?? ??? ??? ??? ??? ??? ?//馬可能走的八個方向
?? ??? ??? ??? ??? ?{1, -2}, { 2, -1},
?? ??? ??? ??? ??? ?{2, 1 }, { 1, 2 },
?? ??? ??? ??? ??? ?{-1, 2}, {-2, 1 },
?? ??? ??? ??? ??? ?{-2, -1},{-1, -2}
?? ??? ??? ??? ?};
?? ?int i, j = 1, flag = 1;
?? ?stack t;
?
?? ?printf("請輸入馬的初始位置:(%d * %d)\n", M, N);
?? ?scanf("%d%d", &t.y, &t.x);
?? ?if (t.x <= 0 || t.x > N || t.y <= 0 || t.y > N){
?? ??? ?printf("輸入的坐標(biāo)超出范圍!\n");
?? ??? ?exit(0);
?? ?}
?? ?t.x--;
?? ?t.y--;
?? ?chess[t.y][t.x] = 1;?? ??? ??? ??? ?//選擇馬的第一個落腳點
?? ?Push(s, t);
?? ?while (s->top < M * N - 1 && s->top != -1){
?? ??? ?for (i = 0; i < 8; i++){
?? ??? ??? ?t.x = s->p[s->top].x + ch[i][0];
?? ??? ??? ?t.y = s->p[s->top].y + ch[i][1];
?? ??? ??? ?//如果它的坐標(biāo)沒有超出范圍,并且沒有走過,則把該路線存入路徑棧
?? ??? ??? ?if (t.x >= 0 && t.y >= 0 && t.x < N && t.y < M && !chess[t.y][t.x]){?? ??? ?
?? ??? ??? ??? ?if(flag){?? ??? ??? ?//沒有退回去
?? ??? ??? ??? ??? ?Push(s, t);
?? ??? ??? ??? ??? ?chess[t.y][t.x] = s->top + 1;
?? ??? ??? ??? ??? ?s->p[s->top - 1].flag = i;
?? ??? ??? ??? ??? ?flag = 1;
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else{?? ??? ??? ??? ?//退回去了
?? ??? ??? ??? ??? ?if (s->p[s->top].flag < i){?? ??? ?//重新走時,讓它的方向不等于原先的方向
?? ??? ??? ??? ??? ??? ?flag = 1;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}?? ?
?? ??? ?//如果沒有能走的路時,即,所有的路徑都超出范圍,或者,該位置已經(jīng)走過了,則,退到上一步,重新選擇;
?? ??? ?if (i == 8){
?? ??? ?
?? ??? ??? ?chess[s->p[s->top].y][s->p[s->top].x] = 0;
?? ??? ??? ?Pop(s);
?? ??? ??? ?flag = 0;
?? ??? ?}
?? ?}
}
void Push(LNode * s, stack x)
{
?? ?if (IsFull(s)){
?? ??? ?printf("棧上溢,不能進(jìn)行入棧操作!\n");
?? ??? ?exit (0);?
?? ?}
?? ?else{
?? ??? ?s->top++;
?? ??? ?s->p[s->top] = x;
?? ??? ?
?? ?}
}
void Pop(LNode * s)
{
?? ?if (IsEmpty(s)){
?? ??? ?printf("棧為空,不能進(jìn)行出棧操作!\n");
?? ??? ?exit(0);
?? ?}
?? ?s->top--;
}
int IsFull(LNode * s)
{
?? ?if (s->top >= M * N){
?? ??? ?return 1;
?? ?}
?? ?else{
?? ??? ?return 0;
?? ?}
}
int IsEmpty(LNode * s)
{
?? ?if (s->top == -1){
?? ??? ?return 1;
?? ?}
?? ?else{
?? ??? ?return 0;
?? ?}
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++ vector的介紹及常見功能實現(xiàn)

    C++ vector的介紹及常見功能實現(xiàn)

    這篇文章主要介紹了C++ vector的介紹及模擬實現(xiàn),vector在實際中非常的重要,但在實際中我們只要熟悉常見的接口就可以了,最重要的是理解他的底層原理,要能夠自己模擬實現(xiàn)出一個簡單的vector,本文結(jié)合示例代碼給大家詳細(xì)介紹,需要的朋友可以參考下
    2023-05-05
  • 詳解C++ 動態(tài)內(nèi)存分配與命名空間

    詳解C++ 動態(tài)內(nèi)存分配與命名空間

    這篇文章主要介紹了詳解C++ 動態(tài)內(nèi)存分配與命名空間,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • C++無鎖數(shù)據(jù)結(jié)構(gòu)實現(xiàn)示例詳解

    C++無鎖數(shù)據(jù)結(jié)構(gòu)實現(xiàn)示例詳解

    這篇文章主要為大家介紹了C++無鎖數(shù)據(jù)結(jié)構(gòu)實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Matlab實現(xiàn)多子圖同步調(diào)整視角

    Matlab實現(xiàn)多子圖同步調(diào)整視角

    這篇文章主要為大家介紹了如何利用Matlab實現(xiàn)多子圖同步調(diào)整視角,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • C++淺析類與對象的基礎(chǔ)

    C++淺析類與對象的基礎(chǔ)

    類和對象是兩種以計算機(jī)為載體的計算機(jī)語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲在內(nèi)存中—個可以擁有在某個范圍內(nèi)的可變存儲區(qū)域
    2022-05-05
  • Qt6.0+vs2019環(huán)境配置的實現(xiàn)教程

    Qt6.0+vs2019環(huán)境配置的實現(xiàn)教程

    這篇文章主要介紹了Qt6.0+vs2019環(huán)境配置的實現(xiàn)教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C語言實現(xiàn)簡單三子棋小游戲

    C語言實現(xiàn)簡單三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 用C++類實現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法

    用C++類實現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法

    下面小編就為大家?guī)硪黄肅++類實現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 詳解C語言的mem系列函數(shù)

    詳解C語言的mem系列函數(shù)

    這篇文章主要為大家詳細(xì)介紹了C語言的mem系列函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 詳解C/C++中const限定符總結(jié)

    詳解C/C++中const限定符總結(jié)

    const是一種限定符,被const所限定的變量其值不可以被改變。。這篇文章主要介紹了C/C++中const限定符總結(jié),通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02

最新評論