hdu 1401(深搜)

//四个点一起搜
//标记四个状态 用八维数组标记
//每搜一个状态需要标记24种状态


#include<stdio.h>
#include<string.h>


int map[10][10];
int ans[10][10];
char  dist[8][8][8][8][8][8][8][8];
int dir[4][2]={1,0, 0,1, -1,0, 0,-1};
int f;


int ok(int x,int y)
{
    if(x<0||x>=8)return 0;
if(y<0||y>=8)return 0;
    if(map[x][y]==1)return 0;
    return 1;
}


void mark(int x1,int y1,int  x2,int y2,int x3,int y3,int x4,int y4,int m)
{
    dist[x1][y1][x2][y2][x3][y3][x4][y4]=m;
    dist[x1][y1][x2][y2][x4][y4][x3][y3]=m;
    dist[x1][y1][x3][y3][x2][y2][x4][y4]=m;
    dist[x1][y1][x3][y3][x4][y4][x2][y2]=m;
    dist[x1][y1][x4][y4][x2][y2][x3][y3]=m;
    dist[x1][y1][x4][y4][x3][y3][x2][y2]=m;


    dist[x2][y2][x1][y1][x3][y3][x4][y4]=m;
    dist[x2][y2][x1][y1][x4][y4][x3][y3]=m;
    dist[x2][y2][x3][y3][x1][y1][x4][y4]=m;
    dist[x2][y2][x3][y3][x4][y4][x1][y1]=m;
    dist[x2][y2][x4][y4][x1][y1][x3][y3]=m;
    dist[x2][y2][x4][y4][x3][y3][x1][y1]=m;


    dist[x3][y3][x1][y1][x2][y2][x4][y4]=m;
    dist[x3][y3][x1][y1][x4][y4][x2][y2]=m;
    dist[x3][y3][x2][y2][x1][y1][x4][y4]=m;
    dist[x3][y3][x2][y2][x4][y4][x1][y1]=m;
    dist[x3][y3][x4][y4][x1][y1][x2][y2]=m;
    dist[x3][y3][x4][y4][x2][y2][x1][y1]=m;


    dist[x4][y4][x1][y1][x2][y2][x3][y3]=m;
    dist[x4][y4][x1][y1][x3][y3][x2][y2]=m;
    dist[x4][y4][x2][y2][x1][y1][x3][y3]=m;
    dist[x4][y4][x2][y2][x3][y3][x1][y1]=m;
    dist[x4][y4][x3][y3][x1][y1][x2][y2]=m;
    dist[x4][y4][x3][y3][x2][y2][x1][y1]=m;






}
void dfs(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int step)
{


    if(f)return;


if(ans[x1][y1]&&ans[x2][y2]&&ans[x3][y3]&&ans[x4][y4])
{
        printf("YES\n");
        f=1;
        return ;
}
if(dist[x1][y1][x2][y2][x3][y3][x4][y4]<=step&&dist[x1][y1][x2][y2][x3][y3][x4][y4]!=-1)return ;//当前状态被标记过并且之前标记该状态时的步数比现在少那么当前状态就不用再搜了
        mark(x1,y1,x2,y2,x3,y3,x4,y4,step);






    int ax,ay,bx,by,cx,cy,dx,dy,i;


    bx=x2;
    by=y2;


    cx=x3;
    cy=y3;


    dx=x4;
    dy=y4;


    for(i=0;i<4;i++)//对四个点分别四个方向的搜
    {
        ax=x1+dir[i][0];
        ay=y1+dir[i][1];
        if(map[ax][ay])
        {
        ax=ax+dir[i][0];
        ay=ay+dir[i][1];
        }
        if(!ok(ax,ay))continue;
        map[ax][ay]=1;
        map[x1][y1]=0;


if(step!=8)
        dfs(ax,ay,bx,by,cx,cy,dx,dy,step+1);
map[ax][ay]=0;
        map[x1][y1]=1;


    }


    ax=x1;
    ay=y1;


    cx=x3;
    cy=y3;


    dx=x4;
    dy=y4;


    for(i=0;i<4;i++)
    {
        bx=x2+dir[i][0];
        by=y2+dir[i][1];
        if(map[bx][by])
        {
        bx=bx+dir[i][0];
        by=by+dir[i][1];
        }
        if(!ok(bx,by))continue;
        map[bx][by]=1;
        map[x2][y2]=0;


if(step!=8)
        dfs(ax,ay,bx,by,cx,cy,dx,dy,step+1);
map[bx][by]=0;
        map[x2][y2]=1;


    }


    bx=x2;
    by=y2;


    ax=x1;
    ay=y1;


    dx=x4;
    dy=y4;


    for(i=0;i<4;i++)
    {
        cx=x3+dir[i][0];
        cy=y3+dir[i][1];
        if(map[cx][cy])
        {
        cx=cx+dir[i][0];
        cy=cy+dir[i][1];
        }
        if(!ok(cx,cy))continue;
        map[cx][cy]=1;
        map[x3][y3]=0;


if(step!=8)
        dfs(ax,ay,bx,by,cx,cy,dx,dy,step+1);
map[cx][cy]=0;
        map[x3][y3]=1;


    }


    bx=x2;
    by=y2;


    cx=x3;
    cy=y3;


    ax=x1;
    ay=y1;


    for(i=0;i<4;i++)
    {
        dx=x4+dir[i][0];
        dy=y4+dir[i][1];
        if(map[dx][dy])
        {
        dx=dx+dir[i][0];
        dy=dy+dir[i][1];
        }
        if(!ok(dx,dy))continue;
        map[dx][dy]=1;
        map[x4][y4]=0;


if(step!=8)
        dfs(ax,ay,bx,by,cx,cy,dx,dy,step+1);
map[dx][dy]=0;
        map[x4][y4]=1;


    }


}
int main()
{
    int x1,x2,x3,x4,y1,y2,y3,y4;
    int xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4;




    while(scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4)!=EOF)
    {
        x1--;
        x2--;
        x3--;
        x4--;


        y1--;
        y2--;
        y3--;
        y4--;






        f=0;
    scanf("%d%d%d%d%d%d%d%d",&xx1,&yy1,&xx2,&yy2,&xx3,&yy3,&xx4,&yy4);


        xx1--;
        xx2--;
        xx3--;
        xx4--;


        yy1--;
        yy2--;
        yy3--;
        yy4--;


    memset(ans,0,sizeof(ans));
    memset(map,0,sizeof(map));
    memset(dist,-1,sizeof(dist));


    map[x1][y1]=1;
    map[x2][y2]=1;
    map[x3][y3]=1;
    map[x4][y4]=1;


    ans[xx1][yy1]=1;
    ans[xx2][yy2]=1;
    ans[xx3][yy3]=1;
    ans[xx4][yy4]=1;


    dfs(x1,y1,x2,y2,x3,y3,x4,y4,0);


    if(!f)printf("NO\n");
    }
    return 0;


}

这个是下载就可以使用的,我正在开的服务端 bukkit版本为493 内含插件 AnjoSecurity 注册登录插件 BackupPlugin 自动备份插件 BorderGuardLite 地图限制范围插件 EssentialsSpawn 出生点设置插件 GroupManager 权限管理插件 LWC 箱子加密插件 -------------------------------- server.properties 基本配置文件 level-name=world 地图名称 hellworld=false 是否开启地狱 false/true spawn-monsters=true 是否开启怪物 false/true online-mode=false spawn-animals=true 是否开启动物 false/true max-players=30 服务器最大同时在线人数 30人 server-ip= 服务器ip(我没有填写) pvp=false 是否开启pk false/true server-port= 服务器端口(我没有填写) white-list=true 是否开启白名单(白名单添加方法下面介绍) spawn-protection=16 出生保护时间 秒 白名单添加方法 在控制台输入 whitelist add xxxx 将xxxx添加到白名单 添加自己到admin组 manselect world 选定world地图 ,这里替换成你的地图名字 manuadd ropng admin 将ropng添加到admin组 将ropng替换成你的名字 ----------------------------------- anjosecurity注册插件 /register 密码 注册密码 /login 密码 登录 /reset 密码 重新设定密码 --------------------------- borderguardlite /setborder 数字 例如 /setborder 20 则设定以自身为原点,直径为40的圆限定范围 ,任何人无法再范围外移动 /disableborder 取消范围 注意! 此插件的权限为 第一个使用此命令的玩家可以永久使用 其他人无法使用 ,所以尽早设置 如无需此插件 进入plugin文件夹 删除borderguardlite.jar ---------------- EssentialsSpawn 重生点设置 游戏内admin组玩家输入 /setspawn 设置玩家当前点为重生点 --------------------------- lwc锁箱子插件 游戏内输入/lwc有详细介绍 --------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值