HDU 3345 - War Chess

本文介绍了一个使用C++实现的迷宫游戏中敌方单位的AI路径寻找算法。该算法利用了宽度优先搜索(BFS)策略,并结合了迷宫地图上的不同元素如陷阱、草药等对移动步数的影响,确保AI能够有效地接近玩家的同时考虑生存能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m,mv;char map[103][103];bool vis[103][103];
struct type{
    int i,j,mv;
    bool operator<(const type &oth)const  
    {
        return mv<oth.mv;  
    }  
}st;
int di[4]={0,-1,0,+1};
int dj[4]={+1,0,-1,0};
bool isout(int i,int j){
    if(i<1 || i>n || j<1 || j>m) return true;
    else return false;
}
bool is_near_enemy(int i,int j){
    for(int k=0;k<4;k++){
        type next;
        next.i=i+di[k],next.j=j+dj[k];
        if(!isout(next.i,next.j) && map[next.i][next.j] == 'E') return true;
    }
    return false;
}
void bfs()
{
    priority_queue<type> q;
    type now,next;
    memset(vis,0,sizeof(vis));
    q.push(st);vis[st.i][st.j]=1;
    while(!q.empty())
    {
        now=q.top();q.pop();
        if(now.mv<=0) continue;
        for(int k=0;k<4;k++)
        {
            next.i=now.i+di[k] , next.j=now.j+dj[k] , next.mv=now.mv;
            if(vis[next.i][next.j] || isout(next.i,next.j) || map[next.i][next.j]=='E' || map[next.i][next.j] == '#') continue;
            if(map[next.i][next.j]=='.') next.mv--;  
            else if(map[next.i][next.j]=='T') next.mv-=2; 
            else if(map[next.i][next.j]=='R') next.mv-=3;  
            else if(map[next.i][next.j]=='P') next.mv--;
            
            if(next.mv<0) continue;
            if(is_near_enemy(next.i,next.j)) next.mv=0;
            if(map[next.i][next.j] != 'P') map[next.i][next.j]='*';
            vis[next.i][next.j]=1;q.push(next);
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&mv);
        for(int i=1;i<=n;i++){
            scanf("%s",map[i]+1);
            for(int j=1;j<=m;j++) if(map[i][j]=='Y') st.i=i , st.j=j , st.mv=mv;
        }
        bfs();
        for(int i=1;i<=n;i++){
        	printf("%s\n",map[i]+1);
        }
        printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值