2014 UESTC Training for Search Algorithm C

贪吃蛇,首要问题是如何记录蛇的状态,蛇头,蛇身中每个点与上一点之间的方向关系。
故可以用哈希来定义状态,这里学习了别人的hash方法。每次找到当前点与前面一点的方向关系来确定hash返回值
剩下的就是直接BFS,每次更新新蛇一定要注意蛇的长度是多少,如果蛇的长度大于等于3,那么碰到蛇的尾部是合法的
如果蛇的长度小于3,那么碰到蛇尾是不合法的
另外注意移动过程中那种情况下都不能碰到蛇身
利用蛇前后位置的一一替换的对应关系,移动蛇身。根据hash判重就可以
每组数据后要清空队列
另外不知道为什么直接用int front,rear; Q【MAXN】会RE。
#include <map>
#include <set>
#include <list>
#include <cmath>
#include<cctype>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b)
{
	return a % b == 0 ? b : gcd(b, a % b);
}
char G[20][20];
int vis[20000000];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int len;
int N,M;
int e_x,e_y,s_x,s_y;
int ans;
struct node
{
    int x[11],y[11];//存蛇的每一个点的横纵坐标
    int dist;
}s;
queue<node>Q;
int get_nextdir(int cur,int pre,node s)
{
    for (int d=0;d<4;d++)
    {
        int nx=s.x[pre]+dx[d];
        int ny=s.y[pre]+dy[d];
        if (nx==s.x[cur] && ny==s.y[cur]) return d;
    }
}
int hash(int x,int y,node s)
{
    int Hash=x*M+y;
    for (int i=1;i<len;i++)
        {
            Hash=Hash*4+get_nextdir(i,i-1,s);
        }
        return (Hash%20000000);
}
void read()
{
    len=0;
    ans=-1;
    memset(G,0,sizeof(G));
    memset(vis,0,sizeof(vis));
    for (int i=0;i<N;i++)
    scanf("%s",G[i]);
    for (int i=0;i<N;i++)
        for (int j=0;j<M;j++)
    {
        if (G[i][j]=='@') {e_x=i;e_y=j;}
        if (isdigit(G[i][j]))
        {
            if (G[i][j]=='1') {s_x=i;s_y=j;}
            s.x[G[i][j]-'1']=i;
            s.y[G[i][j]-'1']=j;
            G[i][j]='.';
            len++;
        }
    }
    s.dist=0;
    int T=hash(s_x,s_y,s);
    vis[T]=1;
    Q.push(s);
    //show();
}
void bfs()
{
    while (!Q.empty())
    {
        node u=Q.front();
        Q.pop();
        if (u.x[0]==e_x && u.y[0]==e_y) {ans=u.dist;return ;}
        int x=u.x[0],y=u.y[0];
        for (int d=0;d<4;d++)
        {
            int nx=x+dx[d];
            int ny=y+dy[d];
            if (nx<0 || nx>=N || ny<0 || ny>=M || G[nx][ny]=='#') continue;
            bool flag=false;
            if (len>=3)
            {
             for (int i=1;i<len-1;i++)
             if (nx==u.x[i] && ny==u.y[i]) {flag=true;break;}
             if (flag) continue;
             node s;
             s.x[0]=nx;s.y[0]=ny;
             for (int i=1;i<len;i++)
             {
                s.x[i]=u.x[i-1];
                s.y[i]=u.y[i-1];
             }
             LL T=hash(nx,ny,s);
             if (!vis[T])
             {
                vis[T]=1;
                s.dist=u.dist+1;
                Q.push(s);
             }
            }
            else
            {
                for (int i=1;i<=len-1;i++)//注意和上一种i<len-1不同
             if (nx==u.x[i] && ny==u.y[i]) {flag=true;break;}
             if (flag) continue;
             node s;
             s.x[0]=nx;s.y[0]=ny;
             for (int i=1;i<len;i++)
             {
                s.x[i]=u.x[i-1];
                s.y[i]=u.y[i-1];
             }
             LL T=hash(nx,ny,s);
             if (!vis[T])
             {
                vis[T]=1;
                s.dist=u.dist+1;
                Q.push(s);
             }
            }
        }
    }
}
int main()
{
    //freopen("sample.txt","r",stdin);
    int kase=1;
    while (scanf("%d%d",&N,&M)!=EOF)
    {
        read();
        bfs();
        printf("Case #%d: %d\n",kase++,ans);
        while (!Q.empty())Q.pop();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
互联网络程序设计是指在互联网上进行程序开发和设计的过程。UESTC则是我国的一所著名高校——电子科技大学。 互联网络程序设计 uestc包含了两个主要的方面:互联网络和程序设计。互联网络是指将多个计算机网络通过通信链路互相连接起来,实现信息共享和资源共享的网络系统。程序设计是指根据需求和目标,通过编写代码和设计算法,实现计算机程序的过程。 互联网络程序设计 uestc的学习内容主要包括以下几个方面: 1. 网络知识:学习互联网络的基本概念、原理和协议,如TCP/IP协议、HTTP协议等。掌握网络编程的基本技术,能够编写网络应用程序。 2. 数据通信:学习数据通信的基本原理和技术,包括数据传输的方式、数据压缩和加密等。了解网络安全和数据保护的基本知识。 3. 程序设计:学习编程语言和开发工具,如Java、C++和Python等。掌握常用的编程技巧和方法,能够设计和实现复杂的网络应用程序。 4. Web开发:学习Web开发的基本知识和技术,包括HTML、CSS、JavaScript等。能够设计和实现交互式的Web应用程序。 5. 数据库技术:学习数据库的基本原理和技术,如SQL语言和数据库管理系统。能够设计和管理数据库,实现数据的存储和检索。 通过学习互联网络程序设计 uestc,可以掌握互联网应用开发的基本技能,具备设计和实现网络应用程序的能力。这对于目前互联网行业的人才需求来说是非常重要的,也为学生提供了广阔的就业和创业机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值