IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++实现八数码游戏 -> 正文阅读

[C++知识库]c++实现八数码游戏

作者:commentBox

c++实现八数码游戏

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <utility>
#include <iomanip>
#include <unordered_set>
#include <time.h>
#include <conio.h>
//#define int long long

using namespace std;
const int N = 4e5 + 10;
bool book[N] = {0};
int mov[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
int step[N] = {0};

int jiecheng(int n)
{
    if (n == 0 || n == 1)
        return 1;
    int ans = 1;
    for (int i = 1; i <= n; i++)
    {
        ans *= i;
    }
    return ans;
}

int kangtuo(int arr[4][4])
{
    int ans = 0;
    int tp = 8;
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
        {
            int cnt = 0;
            for (int k = 1; k <= 3; k++)
            {
                for (int p = 1; p <= 3; p++)
                {
                    if ((k - 1) * 3 + p > (i - 1) * 3 + j)
                    {
                        if (arr[i][j]>arr[k][p]) cnt++;
                    }
                }
            }
            ans+=cnt*jiecheng(9-(i-1)*3-j);
        }
    }
    return ans + 1;
}

struct node
{
    int temp_state[4][4];
    int temp_x, temp_y;
};

bool operator==(node a, node b)
{
    int cnt = 0;
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
        {
            if (a.temp_state[i][j] != b.temp_state[i][j])
                return 0;
        }
    }
    return 1;
}

bool check(int x, int y)
{
    return x <= 3 && x >= 1 && y <= 3 && y >= 1;
}

void Print(node a, node b)
{
    for (int i = 1; i <= 12; i++)
        cout << " ";
    cout << "|"
         << " goal:" << endl;
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
        {
            if (a.temp_state[i][j] == 9)
                cout << " "
                     << "   ";
            else
                cout << a.temp_state[i][j] << "   ";
        }
        cout << "|"
             << "       ";
        for (int j = 1; j <= 3; j++)
        {
            if (b.temp_state[i][j] == 9)
                cout << " "
                     << "   ";
            else
                cout << b.temp_state[i][j] << "   ";
        }
        cout << endl;
        for (int j = 1; j <= 12; j++)
            cout << " ";
        cout << "|";
        if (i < 3)
            cout << endl;
        else
        {
            for (int j = 1; j <= 20; j++)
                cout << " ";
            cout << "dis:" <<step[kangtuo(a.temp_state)]-1<<endl;
        }
    }
    for (int i = 1; i <= 45; i++)
        cout << "-";
    cout << endl;
}

void bfs(node prime)
{
    queue<node> pq;
    pq.push(prime);
    int kt_prim=kangtuo(prime.temp_state);
    step[kt_prim] = 1;
    book[kt_prim] = 1;
    while (!pq.empty())
    {
        node node_tp = pq.front();
        pq.pop();
        int x = node_tp.temp_x, y = node_tp.temp_y;
        int tp_num = kangtuo(node_tp.temp_state);
        for (int i = 0; i < 4; i++)
        {
            node node_tp1=node_tp;
            int tx = x + mov[i][0];
            int ty = y + mov[i][1];
            if (!check(tx, ty))
                continue;
            swap(node_tp1.temp_state[x][y], node_tp1.temp_state[tx][ty]);
            node_tp1.temp_x = tx;
            node_tp1.temp_y = ty;
            int ttp_num = kangtuo(node_tp1.temp_state);
            if (book[ttp_num] == 1)
                continue;
            step[ttp_num] = step[tp_num] + 1;
            pq.push(node_tp1);
            book[ttp_num] = 1;
        }
    }
}

node init()
{
    srand(time(0));
    int a = rand() % jiecheng(9);
    node node1;
    int tp_arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    while (a--)
    {
        next_permutation(tp_arr, tp_arr + 9);
    }
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
        {
            node1.temp_state[i][j] = tp_arr[(i - 1) * 3 + (j - 1)];
            if (node1.temp_state[i][j] == 9)
            {
                node1.temp_x = i;
                node1.temp_y = j;
            }
        }
    }
    return node1;
}

void update(node &a, char b)
{
    int x = a.temp_x, y = a.temp_y;
    if (b == 'w')
    {
        if (check(x - 1, y))
        {
            swap(a.temp_state[x][y], a.temp_state[x - 1][y]);
            a.temp_x--;
        }
    }
    else if (b == 's')
    {
        if (check(x + 1, y))
        {
            swap(a.temp_state[x][y], a.temp_state[x + 1][y]);
            a.temp_x++;
        }
    }
    else if (b == 'a')
    {
        if (check(x, y - 1))
        {
            swap(a.temp_state[x][y], a.temp_state[x][y - 1]);
            a.temp_y--;
        }
    }
    else if (b == 'd')
    {
        if (check(x, y + 1))
        {
            swap(a.temp_state[x][y], a.temp_state[x][y + 1]);
            a.temp_y++;
        }
    }
}

int main()
{
    memset(book, 0, sizeof book);
    memset(step, 0, sizeof step);
    node en = init();
    bfs(en);
    node start = init();
    while(en==start||step[kangtuo(start.temp_state)]==0)
    {
        start=init();
    }
    char op;
    Print(start, en);
    while (1)
    {
        op = getch();
        update(start, op);
        Print(start, en);
        if (start == en)
        {
            cout << "congratulations to you" << endl;
            break;
        }
    }
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:36:23  更:2021-10-15 11:37:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:54:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码