SDUT2465其实玩游戏也得学程序(BFS记录路径问题)

BFS记录路径第一炮


题目连接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2465


思路:搜索找路径问题,DFS进行,调用     DFS(当前->当前点父节点)->起点,思想,以栈为储存结构,保存路径。

和以往BFS不一样的是地图储存在结构体里。。。注意

在DFS时候,BLF0是当前点的父节点,BLF1是其子节点,因为初始时cost是无限大,每次进出队列的过程都保证当前的cost是较小值,所以DFS方向查找路径储存的花费一定是最优的。


504 KB  0ms

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
const int N = 210;
const int maxn = 110;
const int maxm = 21010;
const int inf = 1e8;
#define MIN INT_MIN
#define MAX 1e6
#define LL long long
#define init(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i = a;i<b;i++)
#define max(a,b) (a>b)?(a):(b)
#define min(a,b) (a>b)?(b):(a)
using namespace std;

int n,m;
struct node
{
    int cost,prex,prey,nowx,nowy;
    char fuhao;
}ma[105][105];
int mv[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool OK(int x,int y,int num)
{
    //判断当前地图是否是数字
    if(((0<=ma[x][y].fuhao-'0') && (ma[x][y].fuhao-'0')<=9)&& ma[x][y].cost>num+ma[x][y].fuhao-'0')
        return true ;
    return false;
}
bool BFS()
{
   queue<node>q;
    node t;
    int x,y;
    ma[0][0].cost=0;
    q.push(ma[0][0]);
    while(!q.empty())
    {
        t = q.front();
        q.pop();
        if(t.nowx == n-1 && t.nowy == m-1)
            return true;
        FOR(i,0,4)
        {
            x=t.nowx+mv[i][0];
            y=t.nowy+mv[i][1];
            if(0<=x && x<n && 0<=y && y<m)
            {
                 if(OK(x,y,t.cost))//判断数
                {
                    ma[x][y].cost = t.cost + ma[x][y].fuhao - '0' + 1;
                    ma[x][y].prex = t.nowx;
                    ma[x][y].prey = t.nowy;
                    q.push(ma[x][y]);
                }
                else if(ma[x][y].fuhao =='.' && ma[x][y].cost > ma[t.nowx][t.nowy].cost+1)
                {
                    ma[x][y].cost = ma[t.nowx][t.nowy].cost + 1;
                    ma[x][y].prex = t.nowx;
                    ma[x][y].prey = t.nowy;
                    q.push(ma[x][y]);
                }
            }
        }
    }
    return 0;
}
void LOL(int nowx,int nowy)//DFS找父节点
{
    if(nowx==0 && nowy==0)
        return ;

    LOL(ma[nowx][nowy].prex,ma[nowx][nowy].prey);
    int BLF0 = ma[ma[nowx][nowy].prex][ma[nowx][nowy].prey].cost;
    BLF0 += 1;
    int BLF1 = ma[nowx][nowy].cost;
    printf("%ds:(%d,%d)->(%d,%d)\n",BLF0,ma[nowx][nowy].prex,ma[nowx][nowy].prey,nowx,nowy);
    BLF0 += 1;

    FOR(i,BLF0,BLF1+1)
    {
        printf("%ds:FIGHT AT (%d,%d)\n",i,nowx,nowy);
    }
}
int main()
{
    char str[110];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0 && m==0)
            break;
        FOR(i,0,n)
        {
            scanf("%*c%s",str);
            FOR(j,0,m)
            {
                ma[i][j].fuhao = str[j];
                ma[i][j].nowx = i;
                ma[i][j].nowy = j;
                ma[i][j].cost = inf;//BFS记录路径找最小值问题 ,花费初始化一定要最大
            }
        }
        int BLF2 = BFS();
        if(!BLF2)
        {
            puts("GAME OVER.");
            puts("FINISH");
            continue;
        }
        LOL(n-1,m-1);
        puts("FINISH");
    }
    return 0;
}


你可能感兴趣的:(SDUT2465其实玩游戏也得学程序(BFS记录路径问题))