路径寻找问题……!

一开始哈希表那部分死活看不懂……

就是你找到head[]数组标记的每个哈希数最开始的坐标。

然后 next[]数组标记的是相同的哈希数的一条链……

主要代码……

bool try_to_insert(int s){
    int h = hash(st[s]); /*相对应的哈希数*/
    int u = head[h];   ///*head数组一开始初始化为0,为链首*/
    while(u){  /*一直找到为0的情况……!*/
        if(memcmp(&st[u],&st[s],sizeof(st[s])) == 0)  ///*如果找到相同的返回0*/
            return 0;
        u = next[u];///*链的下一个……*/
    }
    next[s] = head[h];
    head[h] = s;  ///*形成链,串起来!!!*/
    return 1;
}

题意就是3*3的方格有一个数目为0表示空,然后和相邻的之间可以滑动,问一个给定的布局变换到目标布局的最小步数。

嗨嗨嗨……!!!自己还是弱爆了……!

主要书bfs搜索……

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cctype>
#include <string>
#include <malloc.h>
#include <queue>
#include <map>

using namespace std;

const int INF = 0xffffff;
const double esp = 10e-8;
const double Pi = 4 * atan(1.0);
const int Maxn = 1000000;
const int mod = 10000007;
const int dr[] = {1,0,-1,0,-1,1,-1,1};
const int dc[] = {0,1,0,-1,1,-1,-1,1};

const int hashsize = 1000003;
int head[hashsize],next[Maxn];
typedef int State[9];
State st[Maxn],goal; //状态数组
int dist[Maxn];

void init_lookup_table(){
    memset(head,0,sizeof(head));
    memset(dist,0,sizeof(dist));
    memset(next,0,sizeof(next));
}
int hash(State & s){
    int v = 0;
    for(int i = 0;i < 9;i++){
        v += v * 10 + s[i];
    }
    return v % hashsize;
}

bool try_to_insert(int s){
    int h = hash(st[s]);
    int u = head[h];
    while(u){
        if(memcmp(&st[s],&st[u],sizeof(st[s])) == 0){
            return 0;
        }
        u = next[u];
    }
    next[s] = head[h];
    head[h] = s;
    return 1;
}

int bfs(){
    init_lookup_table();
    int front = 1;
    int rear = 2;
    while(front < rear){
        State &s = st[front];
        if(memcmp(s,goal,sizeof(s)) == 0)
            return front;
        int z;
        for(z = 0;z < 9;z++){
            if(!s[z])
                break;
        }
        int x = z/3;
        int y = z%3;
        for(int i = 0;i < 4;i++){
            int xx = x + dr[i];
            int yy = y + dc[i];
            int zz = xx * 3 + yy;
            if(xx >= 0 && xx < 3 && yy >= 0 && yy < 3){
                State &t = st[rear];
                memcpy(&t,&s,sizeof(s));
                t[zz] = s[z];
                t[z] = s[zz];
                dist[rear] = dist[front]+1;
                if(try_to_insert(rear) == 1){
                    rear++;
                   /* for(int j = 0;j < 9;j++){
                        if(j % 3 == 0)
                            cout << endl;
                        cout << t[j];
                    }
                    cout << endl;
                    if(rear == 70)
                        return -1;*/
                }
            }
        }
        front++;
    }
    return 0;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("inpt.txt","r",stdin);
#endif
    for(int i = 0;i < 9;i++)
        scanf("%d",&st[1][i]);
    for(int i = 0;i < 9;i++)
        scanf("%d",&goal[i]);
    int ans = bfs();
    if(ans > 0)
        printf("%d\n",dist[ans]);
    else
        printf("-1\n");
    return 0;
}

时间: 2024-10-17 14:49:59

路径寻找问题……!的相关文章

八数码问题+路径寻找问题+bfs(隐式图的判重操作)

Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 process()  初始化vis数组,初始化初始节点到目标节点的移动距离 dfs()搜索到每一个节点,如果不是目标节点,对其依次扩展所有子节点,并判重,全部子节点搜索完全后,改变父节点:如果是目标节点成功返回 输出最少移动步数 input: 2 6 4 1 3 7 0 5 8 8 1 5 7 3 6

Fill-倒水问题(Uva-10603-隐式图路径寻找问题)

原题:https://uva.onlinejudge.org/external/106/10603.pdf 有三个没有刻度的杯子,它们的容量分别是a, b, c, 最初只有c中的杯子装满水,其他的被子都是空的.问如果通过倒水得到d升水, 若可以得到,还要求最少的倒水总量(每倒一次水,都加入到总量里).若不能得到d升水,求比d小的距离d最近的d'升水, 及最少倒水总量. 分析: 因为是求最少倒水总量,本能地想到用bfs搜索.最开始读错题了...看成求倒水的最少次数,这个很简单.....我们可以把求

路径寻找(隐式图遍历)

八数码难题 参考代码:(刘汝佳<算法竞赛入门经典>,源代码在首页置顶区的代码仓库 编码和解码 //无权图上的最短路,可用BFS求解 #include<bits/stdc++.h> using namespace std; const int MAX = 1000000; typedef int State[9] ; // 定义"状态"类型 State st[MAX],goal;//状态数组 int dis[MAX];//距离数组 //ps: 如果需要答应路径,

BFS(路径寻找问题)

很多问题都可以归结为图的遍历,但这些问题中的图却不是事先给定.从程序中读入的,而是由程序动态生成的,称为隐式图. 回溯法一般是要找一个(或者所有)满足约束的解(或者某种意义下的最优解). 路径搜索问题可以归结为隐式图的遍历,它的任务是找到一条从初始状态到终止状态的(最优)路径. BFS是图的广度遍历,借助队列来实现.(其实觉得图真的蛮重要,递归可以视作解答树的深度遍历这里又出现了广度遍历.) 经典问题一:迷宫问题 n*n的格子,0为路,1为墙,找出可以通关的最短路径长度 计算每一个点到起点的最短

【路径寻找问题】UVa 10603 - Fill

如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 const int maxn =

路径寻找技巧

在index文件里面发现了一个这样的模板,type为template.这种不会显示出来的. 没头绪,只懂得id 到js文件里面看 打开这俩js m-core.js m-team-account.js?v=20140117 这是俩压缩文件,通过两个简单的js文件写入所有的js,减少了请求.(是不是本地的才会减少请求,若write是一个在线的就无效啊?) 而这俩文件在控制台里是压缩过的.通过{}键可以format压缩文件. core一般是主逻辑,不会变.业务逻辑一般放在具体的js中,特别是有加时间戳

J2EE web项目中解决所有路径问题

Java中使用的路径,分为两种:绝对路径和相对路径.归根结底,Java本质上只能使用绝对路径来寻找资源.所有的相对路径寻找资源的方法,都不过是一些便利方法.不过是API在底层帮助我们构建了绝对路径,从而找到资源的! 在开发Web方面的应用时, 经常需要获取服务器中当前WebRoot的物理路径. 如果是Servlet , Action , Controller, 或者Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletCo

在开发中关于javaweb中的路径问题小结

转自http://blog.csdn.net/yinyuehepijiu/article/details/9136117 在javaweb项目中添加配置文件,满足连接数据库配置参数以及其他自定义参数存放,可自己写一个配置文件**.properties,把项目所需的自定义配置信息以名值对的形式写入文件.在项目工程目录下的WebRoot\WEB-INF\classes目录下新建一个conf文件夹专门存放配置文件,然后把**.properties配置文件放到conf中,部署时IDE会自动将其复制到相应

刚开始学java和刚去工作的时候,1.path路径 2.classpath路径 还有JAVA_HOME相当于/dgs这个路径

1.PATH路径,寻找javac.exe 如:%JAVA_HOME% 即是对应的是这个路径 在对应的路径下找到了这个命令 删除掉之后 在用户变量下面重新配置一下,也可以运行了 用户变量要是换了一个用户的话,则这路径失效,要无论什么用户都有效,在系统变量里配置 claspath路径,按路径寻找class文件并执行 新下载一个JDK 然后只进行了path变量的配置 javac编译  java运行 命令 输入java 和 java命令可以运行 cclasspath没配在当前路劲下找   配了只在cla