最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用C++來(lái)解決3*3拼圖的問(wèn)題

 更新時(shí)間:2022年07月25日 14:12:56   作者:林三撇  
這篇文章主要介紹了用C++來(lái)解決3*3拼圖的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

解決3*3拼圖的問(wèn)題

拼圖問(wèn)題

在3*3的拼圖中,如何用最少步驟拼好它,這個(gè)問(wèn)題是一個(gè)最短路徑問(wèn)題,可以使用BFS來(lái)求解,每個(gè)節(jié)點(diǎn)是一個(gè)狀態(tài),然后得到最少步驟,中間狀態(tài)可能需要對(duì)每一個(gè)狀態(tài)進(jìn)行編碼或者散列記錄才能輸出,本代碼只解決了求最短步數(shù),其實(shí)利用一個(gè)棧是可以實(shí)現(xiàn)打印解題過(guò)程的。

代碼

#include<bits/stdc++.h> 
using namespace std;

typedef int State[9];
const int maxstate=1000000;
State st[maxstate],goal;
int dist[maxstate];

const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
int vis[362880],fact[9];

void init_lookup_table(){
    fact[0]=1;
    for(int i=1;i<9;i++)    fact[i]=fact[i-1]*i;
}
int try_to_insert(int s){
    int code=0;
    for(int i=0;i<9;i++){
        int cnt=0;
        for(int j=i+1;j<9;j++)  if(st[s][j]<st[s][i])   cnt++;
        code+=fact[8-i]*cnt;
    }
    if(vis[code])   return 0;
    return vis[code]=1;
}
int bfs(){
    init_lookup_table();
    int front=1,rear=2;
    while(front<rear){
        State& s=st[front];
        if(memcmp(goal,s,sizeof(s))==0) return front;
        int z;
        for(z=0;z<9;z++)    if(!s[z])   break;
        int x=z/3, y=z%3;
        for(int d=0;d<4;d++){
            int newx=x+dx[d];
            int newy=y+dy[d];
            int newz=newx*3+newy;
            if(newx>=0&&newx<3&&newy>=0&&newy<3){
                State& t=st[rear];
                memcpy(&t,&s,sizeof(s));
                t[newz]=s[z];
                t[z]=s[newz];
                dist[rear]=dist[front]+1;
                if(try_to_insert(rear)) rear++;
            }
        }
        front++;
    }
    return 0;
}
int main(){
    freopen("F://inp.txt","r",stdin);
    for(int i=0;i<9;i++)    cin>>st[1][i];
    for(int i=0;i<9;i++)    cin>>goal[i];
    for(int i=0;i<9;i++){if(i&&i%3==0)  cout<<endl;cout<<st[1][i]<<" ";}
    int ans=bfs();
    if(ans>0)   printf("\nNeed %d steps come out!\n",dist[ans]);
    else    printf("\nNo way!\n");
    for(int i=0;i<9;i++){if(i&&i%3==0)  cout<<endl;cout<<goal[i]<<" ";}
    return 0;
}

純C語(yǔ)言寫的拼圖游戲

大家好,剛才整理文件,找到了自己高三?高二?時(shí)候改編的拼圖游戲,當(dāng)然,因?yàn)閏不支持圖片,所以以數(shù)字1-8代替的,算法通用。。。

聲明:

看圖片,我放到網(wǎng)盤都3年了,里面自己改編了一半,算是半原創(chuàng),算法作者找不到了、、、

以下正文

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int MenuReturn;
void RandMap(char map[][3]);//隨機(jī)生成數(shù)
void Game(void);//游戲主循環(huán) 
int Help(void);//游戲玩法介紹 
int About(void);
int        Menu(void);
void DealWithMenu(int MenuReturn); 
void Show(char map[][3]);
int IsWin(char map[][3]);//判斷是否達(dá)成勝利條件 
int main(void)
{
        system("color 1E");
        while(1)
        {
                MenuReturn = Menu();
                DealWithMenu(MenuReturn);
        }
        return 0;
} 
int        Menu(void)
{
        int sel = 1;
        int tem = 0;
        char kb;
        system("cls");
        printf("  數(shù)字拼圖      加q:1179307527\n\n\n");
        printf("->開(kāi)始游戲<-\n  玩法介紹  \n  關(guān)    于  \n  退出游戲  \n");
        do{
                kb = getch();
                switch(kb)
                {
                        case 'w' : tem--;sel += tem;break;
                        case 's' : tem++;sel += tem; break;        
                        default  : NULL ; break;
                }
                tem = 0;
                if (sel == 0)
                {
                        sel = 4;
                }
                if (sel == 5)
                {
                        sel = 1;
                }
                system("cls");
                printf("  數(shù)字拼圖\n\n\n");
                switch (sel)
                {
                        case 1 : printf("->開(kāi)始游戲<-\n  玩法介紹  \n  關(guān)    于  \n  退出游戲  \n");break;
                        case 2 : printf("  開(kāi)始游戲  \n->玩法介紹<-\n  關(guān)    于  \n  退出游戲  \n");break;
                        case 3 : printf("  開(kāi)始游戲  \n  玩法介紹  \n->關(guān)    于<-\n  退出游戲  \n");break;
                        case 4 : printf("  開(kāi)始游戲  \n  玩法介紹  \n  關(guān)    于  \n->退出游戲-<\n");break;
                        default: return-1; break; 
                }
        }while(kb != '\r');
 
        return sel;
}
void DealWithMenu(int MenuReturn)
{
        int retu;
        switch(MenuReturn)
        {
                case 1 : Game();break;
                case 2 : retu = Help();break;
                case 3 : retu = About();break;
                case 4 : exit(0);break;
                case -1: printf("發(fā)生未知錯(cuò)誤!\n");        
        }
 
}
void Show(char map[][3])
{
        int i,j;
        system("cls");
        for(i=0;i<3;i++)
        {
                for(j=0;j<3;j++)
                {
                        printf("%2c",map[i][j]);
                }
                printf("\n");
        }
        
        return;
}
void MoveNumber(char map[][3],int *Crx,int *Cry)
{
        enum {UP,DOWN ,LEFT ,RIGHT};
        int kb;
        int dx = 0,dy = 0;
        switch(getch())
        {
                case 'w' :dy--;kb = UP;  break;
                case 's' :dy++;kb = DOWN;break;
                case 'a' :dx--;kb = LEFT;break;
                case 'd' :dx++;kb = RIGHT;break;
                default  :NULL;break; 
        }
        if(kb == UP&& *Cry+1<=2)
        {
                map[*Cry][*Crx] = map[*Cry+1][*Crx];
                map[*Cry+=1][*Crx] = ' ';
        }
        if(kb == DOWN&&*Cry-1>=0)
        {
                map[*Cry][*Crx] = map[*Cry-1][*Crx];
                map[*Cry-=1][*Crx] = ' ';
        }
        if(kb == LEFT&&        *Crx+1<=2)
        {
                map[*Cry][*Crx] = map[*Cry][*Crx+1];
                map[*Cry][*Crx+=1] = ' ';
        }
        if(kb ==RIGHT&& *Crx-1>=0)
        {
                map[*Cry][*Crx] = map[*Cry][*Crx-1];
                map[*Cry][*Crx-=1] = ' ';
        }
        
        return;
}
void RandMap(char map[][3])
{
        
        int i,j,k,n = 0;
        srand((unsigned)time(NULL));
        for(i = 0;i<8;i++)
        {
                map[0][i] = '1'+i;
        }
        while(n<99)//隨機(jī)交換99次,這個(gè)算法不太好,容易出現(xiàn)死局 
        {
                int tem;
                j = rand()%8; 
                k = rand()%8;
                if (k-j == 1||j-k == 1||k-j == 3||j-k == 3)
                {
                        continue;//減小死局出現(xiàn)的概率,相鄰位置的數(shù)字不能交換 
                }
                tem = map[0][k];
                map[0][k] = map[0][j];
                map[0][j] = tem;
                n++;
        }//這個(gè)算法可以實(shí)現(xiàn)指定數(shù)組的亂序排列,但對(duì)本游戲不太合適,亂序不保證游戲有解 
        
        
        map[2][2] = ' ';
 
}
int Help(void)
{
        int judje = 0;
        system("cls");
        printf("點(diǎn)擊開(kāi)始游戲,程序會(huì)隨機(jī)生成一個(gè)數(shù)陣,例如\n"
                        "314\n286\n75 \n點(diǎn)擊wasd移動(dòng)數(shù)字,直至\n123\n456\n78 \n則勝出\n");
        printf("返回菜單嗎?\t   =====   y/n\n");
        do{
                int ch = getchar();
                if(ch == 'y')
                {
                        return 1;
                }
                if(ch == 'n')
                {
                        judje = 1;
                }
        }while(judje == 1);
} 
int About(void)
{
        int judje = 0;
        system("cls"); 
        printf("本游戲由莫言情難忘改編\n編程之路,從這里開(kāi)始\n");
        printf("返回菜單嗎?\t   ======    y/n\n");
        do{
                int ch = getchar();
                if(ch == 'y')
                {
                        return 1;
                }
                if(ch == 'n')
                {
                        judje = 1;
                }
        }while(judje == 1);
}
int IsWin(char map[][3])
{
        int i;
        int j = 0;
        for(i = 0;i<8;i++)
        {
                if (map[0][i] == '1'+i)
                j++;
        }
 
   if (j == 8)
   {
                   return 1;
   }
   else 
   {
                   return 0;
   }
 
 
} 
void Game(void)
{
        char Map[3][3] = {0};
        int Crx = 2;
        int Cry = 2;
        RandMap(Map);//先生成一個(gè)
        Show(Map);
        printf("任意鍵開(kāi)始游戲!!\n");
        getch();
        unsigned int t1 = time(NULL);
        while(1)
        {
                MoveNumber(Map,&Crx,&Cry);//用戶操作 
                Show(Map);
                unsigned int t2 = time(NULL);
                if(IsWin(Map))
                {
                        printf("勝利~!用時(shí)%dS",t2-t1);
                        return;
                }
        }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++11-20 常量表達(dá)式的使用

    C++11-20 常量表達(dá)式的使用

    本文主要介紹了C++11-20常量表達(dá)式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語(yǔ)言實(shí)現(xiàn)走迷宮

    C語(yǔ)言實(shí)現(xiàn)走迷宮

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++超詳細(xì)分析單鏈表的實(shí)現(xiàn)與常見(jiàn)接口

    C++超詳細(xì)分析單鏈表的實(shí)現(xiàn)與常見(jiàn)接口

    鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的,本章帶你分析單鏈表的實(shí)現(xiàn)與常見(jiàn)接口
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)快速排序

    C語(yǔ)言實(shí)現(xiàn)快速排序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)快速排序算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • java 中ArrayList與LinkedList性能比較

    java 中ArrayList與LinkedList性能比較

    這篇文章主要介紹了java 中ArrayList與LinkedList性能比較的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++中引用的使用總結(jié)

    C++中引用的使用總結(jié)

    以下是對(duì)C++中引用的使用進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過(guò)程

    Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過(guò)程

    這篇文章主要介紹了Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過(guò)程,對(duì)于用MAC學(xué)習(xí)Unix環(huán)境高級(jí)編程的同學(xué)會(huì)有些作用,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言堆棧幀的介紹與創(chuàng)建

    C語(yǔ)言堆棧幀的介紹與創(chuàng)建

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言堆棧幀的相關(guān)資料,堆棧幀 (stack frame)( 或活動(dòng)記錄 (activation Tecord)) 是一塊堆棧保留區(qū)域,用于存放被傳遞的實(shí)際參數(shù)、子程序的返回值、局部變量以及被保存的寄存器,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例

    C語(yǔ)言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例

    這篇文章主要介紹了C語(yǔ)言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例,文中的示例環(huán)境為Windows系統(tǒng),需要的朋友可以參考下
    2015-11-11
  • VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng))

    VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng))

    這篇文章主要介紹了VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng)),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

桂平市| 收藏| 北川| 体育| 藁城市| 南京市| 云和县| 化州市| 宣汉县| 和林格尔县| 精河县| 临高县| 辽阳市| 宜州市| 玉屏| 方城县| 吕梁市| 隆回县| 德江县| 凤庆县| 江油市| 盘锦市| 原阳县| 雅安市| 百色市| 青神县| 咸丰县| 玛纳斯县| 丽水市| 竹溪县| 桃江县| 若尔盖县| 日土县| 营山县| 宜阳县| 威信县| 吴川市| 无棣县| 元江| 永兴县| 龙游县|