15数码(A*)(未完成版)

#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <windows.h>
#include <algorithm>
using namespace std;
struct Map{int data[4][4],x,y,tot,nxt;Map(){nxt = -1;tot = 0;}};
map<string,bool>inqueue;
string tmp;
Map queue[4000000],temp[5];
int t = 1,w = 2,right[4][4],ans = -1,Value[5];
int px[5] = {0,-1,0,1,0},py[5] = {0,0,1,0,-1};
int abs(int q){return q >= 0 ? q : 0 - q;}
bool cmp(int aaa,int bbb){
    aaa > bbb;//////////////////////////////////////////////////////////////////////////
}
int V(Map f){
    int res = 0;
    for(int i = 0;i < 4;i++)
        for(int j = 0;j < 4;j++)
            for(int k = 0;k < 4;k++)
                for(int l = 0;l < 4;l++)
                    if(f.data[i][j] == right[k][l])/////////////////////////////////////
                        res += abs(i - k) + abs(j - l);
    return res;
}
void print(int x){
    if(queue[x].nxt != -1)
        print(queue[x].nxt);
    Sleep(1000);
    system("cls");
    for(int i = 0;i < 4;i++){
        for(int j = 0;j < 4;j++)
            printf("%3d",queue[x].data[i][j]);
        printf("\n");
    }
    puts("");
}
void swap(int &A,int &B){int temp = A;A = B;B = temp;}
bool judge(Map x){
    for(int i = 0;i < 4;i++)
        for(int j = 0;j < 4;j++)
            if(x.data[i][j] != right[i][j])
                return 0;
    return 1;
}
void work(Map de){
    int Qoos = 0;
    for(int i = 0;i < 4;i++)
        for(int j = 0;j < 4;j++)
            tmp[++Qoos] = de.data[i][j];
}
bool Iq(Map x,bool pp){work(x);inqueue[tmp] = pp;}
bool iq(Map x){work(x);return inqueue[tmp];}
void bfs(){
//    while(t < w){
//        Map x;
//        for(int i = 1;i <= 4;i++){
//            x = queue[t];
//            int xx = x.x + px[i],yy = x.y + py[i];
//            if(xx < 0 || xx > 3 || yy < 0 || yy > 3)
//            swap(x.data[x.x][x.y],x.data[xx][yy]);
//
//            x.x = xx;x.y = yy;x.tot++;Iq(x,1);
//            queue[w] = x;
//            queue[w].nxt = t;///////////////////////////mmmmmmmmmmmmmaaaaaaaaaaaaaaaaaaaiiiiiiiiiiiinnn/
//            ///////////////////////////mmmmmmmmmmmmmaaaaaaaaaaaaaaaaaaaiiiiiiiiiiiinnn/
//            w++;
//        }
//        t++;
//    }
int tt = 0;
    while(t < w){
        Map x;
        for(int i = 1;i <= 4;i++){
//            printf("$");
            temp[i] = queue[t];
            int xx = temp[i].x + px[i];
            int yy = temp[i].y + py[i];
            if(xx < 0 || xx > 3 || yy < 0 || yy > 3){Value[i] = -1;continue;}
            swap(temp[i].data[temp[i].x][temp[i].y],temp[i].data[xx][yy]);
            if(iq(temp[i])){Value[i] = -1;continue;}
            temp[i].x = xx;temp[i].y = yy;temp[i].tot++;Iq(temp[i],1);
            Value[i] = V(temp[i]);
        }
        sort(Value + 1,Value + 4,cmp);
        for(int i = 1;i <= 4;i++){
//            printf("#");
            if(Value[i] == -1)continue;
            queue[w] = temp[i];
            queue[w].nxt = t;
            if(judge(queue[w])){ans = w;return;}
            w++;
        }
        t++;
    }
}
int main()
{
//    freopen("out.txt","w",stdout);
    tmp = "                ";
    for(int i = 0;i <= 3;i++)
        for(int j = 0;j <= 3;j++){
            scanf("%d",&queue[1].data[i][j]);
            if(queue[1].data[i][j] == 0){queue[1].x = i;queue[1].y = j;}
        }
    int pos = 0;
    for(int i = 0;i <= 3;i++)
        for(int j = 0;j <= 3;j++)
            right[i][j] = ++pos;
    right[3][3] = 0;
    if(judge(queue[1])){printf("right!\n");return 0;}
    Iq(queue[1],1);puts("...");bfs();
    puts("Done!");
    if(ans == -1) printf("No Solution!\n");
    else print(ans);
    return 0;
}
/*
0 4 8
2 6 3
1 7 5
0 4 8
2 6 3
1 7 5

0 4 8
2 6 3
1 7 5
0 2 3
1 8 4
7 6 5

1 2 3
4 5 6
7 8 0
1 2 3
4 5 6
7 0 8

1 2 3 4
5 6 7 8
9 0 11 12
13 10 14 15

3 6 1 2
10 0 4 13
9 7 14 5
15 12 8 11

8 15 3 7
1 9 11 4
6 12 14 5
13 10 2 0
*/
时间: 2024-11-11 14:41:20

15数码(A*)(未完成版)的相关文章

实验二 四则运算 未完成版

package size; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListe

sgu139Help Needed!判断15数码是否有解,以及判断N数码是否有解的推论

是这样的,要你判断一个15数码是否有解. 我不会,找了这样一个方法. 将16个数按出现顺序存放在一维数组里面, 然后累加每个数的逆序对数目, 还要加上0到终态的曼哈顿距离,得到一个数x. 由于最后的状态,整个图的逆序对数目是15, 是个奇数,于是,如果x也是奇数, 那么这个15数码就有解, 否则无解. 其它各种数码,都按照此法解就是了, 我的代码如下: #include<iostream> using namespace std; int main() { int map[16],ans=0;

UVA - 10181 15-Puzzle Problem(15数码 A*)

题目大意: 给你一个八数码的序列,要求你在50步之内还原成,初始的形状,如果可以就输出其路径,否则就输出 This puzzle is not solvable. 解析: 这题是用A*算法实现的,上网查了很多资料,了解了什么是A*算法. A*算法,实质上是根据估价函数进行bfs,每次都选取估价最小的状态,进行移动. 其中 f(n) 是从初始点经由节点n到目标点的估价函数, g(n) 是在状态空间中从初始节点到n节点的实际代价, h(n) 是从n到目标节点最佳路径的估计代价 f(n) = g(n)

下载利器! IDM 6.28.15 最新绿色特别版

国外流行下载工具Internet Download Manager现已小幅更新至v6.28.15,新版已经取消了Win10下载对话框边框!IDM作为必备最佳网络下载利器,界面风格始终一样,建议使用最新版,新版监视文件类型更全! IDM绿色特别版由 ZD423 专注优化,无需序列号,免注册即为授权版.完美简体中文汉化,无多余菜单弹窗!IDM下载器是国内外优秀下载工具,支持IE, Firefox, Chrome等所有浏览器,兼容所有Windows平台.最具特色功能如续传功能,支持恢复因为断线.网络问

c++ 八数码问题增强版

layout: post title: 八数码问题增强版 subtitle: c++ 八数码问题增强版 date: 2019-08-07 author: dainuofei header-img: img/post-bg-universe.jpg catalog: true tags: - BFS --- 题目描述 三行三列的数组,其元素值为0至8的数.现有如下的变换规则: 1: 将0与上面一行元素对换 2:将0与下面一行元素对换 3:将0与左面一行元素对换 4:将0与右面一行元素对换 如果已知

八数码问题强化版:十五数码问题idA*版本

---恢复内容开始--- 上一次介绍过dbfs版本,这次来介绍idA*版本. 首先要理解idA*算法的思想,是将迭代加深与A*的结合,将估价函数h(n)作为迭代的限制值,进行dfs. (A*和迭代加深的介绍等有时间再写出来吧) 对所有点(除0以外的)进行曼哈顿距离计算(目标状态到初始状态),h(n)为当前节点的各点的曼哈顿距离和. 在代码中看: #include<cstdio> #include<algorithm> #include<cstring> #define

八数码(map版)

八数码 map真是个奇技淫巧好东西 可以十分简单的实现hash,当然速度就不敢保证了 因为九位数不算很大,完全可以用int存下,所以便将八数码的图像转换成一个int型的数字 #include<iostream> #include<queue> #include<map> #include<algorithm> using namespace std; int d[4]={-3,-1,1,3}; struct node { int position;//用0表

马走日 (未完成版)

#include<stdio.h> int d_x[8] = { 2,2,1,1,-2,-2,-1,-1};int d_y[8] = { 1,-1,2,-2,1,-1,2,-2};                                     //马行走的八个方向 int c_x = 1;int c_y = 1;                                     //当前马的坐标位置 int o_x;int o_y;int o_i;int path[26] =

学校管理系统代码未完成版

代码还没完成,遇到了瓶颈,请看的朋友留言给我,给点建议,完善一下 1 import datetime 2 3 class School(object): 4 '''总部学校类''' 5 def __init__(self,name,addr,website): 6 self.name = name 7 self.addr = addr 8 self.branches = {} #下属分校 9 self.website = website 10 self.balance = 0 11 print(