hdu1026(linxingqiangglai)

这题用到的是广度优先搜索,能够最先到达最优解,原来以为是如果不注意会出现暴力搜索,但是后面和同学交流以后,发现是我能力有限,不是那个原因,

主要的原因是因为我用的是不是递归方式来广度搜索,用的是数组来实现广度优先搜索,所以会出现数组非法访问的问题,这对我来说确实是一个教训。

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int dp[110][110],prt[110][110];
char gr[110][110];
int queue[110*110*20][2];
int n,m;
void bfs()
{
//int count=0;
//int flag=0;
int tab[4][2]={0,1,0,-1,1,0,-1,0};
int front=0,rear=1,parent;
int time=0;
dp[0][0]=0;
queue[0][0]=0,queue[0][1]=0;
while(front!=rear)
{
parent=front;
int x=queue[front][0];
int y=queue[front][1];
front++;
for(int i=0;i<4;i++)
{
int xx=x+tab[i][0];
int yy=y+tab[i][1];
if(xx<0||xx>=n) continue;
if(yy<0||yy>=m) continue;
if(gr[xx][yy]=='X') continue;
time=dp[x][y]+1;
if(gr[xx][yy]!='.') time+=(int)(gr[xx][yy]-'0');
if(dp[xx][yy]!=-1&&dp[xx][yy]<=time)continue;
//printf("time=%d\n",time);
//printf("dp[%d][%d]=%d,dp[%d][%d]=%d",x,y,dp[x][y],xx,yy,dp[xx][yy]);
//cout<<endl;

//printf("(%d,%d)->(%d,%d)\n",x,y,xx,yy);
dp[xx][yy]=time;
prt[xx][yy]=parent;
queue[rear][0]=xx;
queue[rear][1]=yy;
rear++;
// count++;
//if(count>n*m)
// {
// flag=1;
// break;
// }
}
// if(flag==1) break;

}
}
int print(int x,int y)
{
if(prt[x][y]==-1) return 0;
int parent=prt[x][y];
int xx=queue[parent][0];
int yy=queue[parent][1];
int t=print(xx,yy);

printf("%ds:(%d,%d)->(%d,%d)\n",++t,xx,yy,x,y);
if(gr[x][y]!='.')
{
int num=(int)(gr[x][y]-'0');
for(int i=0;i<num;i++)
{
printf("%ds:FIGHT AT (%d,%d)\n",++t,x,y);
}
}
return t;

}
int main()
{
while(~scanf("%d%d",&n,&m))
{
//cout<<"n="<<n<<endl;
//cout<<"m="<<m<<endl;
for(int i=0;i<n;i++)
{
scanf("%s%*c",gr[i]);
}
memset(dp,-1,sizeof(dp));
memset(prt,-1,sizeof(dp));
memset(queue,-1,sizeof(queue));
bfs();
if (dp[n-1][m-1] == -1)
            puts ("God please help our poor hero.") ;
        else
        {
            printf ("It takes %d seconds to ""reach the target "
            "position, let me show you the way.\n", dp[n-1][m-1]) ;
            print(n-1, m-1) ;
        }
        puts ("FINISH") ;
}


return 0;
}

/*

红色部分要特别注意有没有等号的区别,如果没有等号就会出现路径太多,以至于一个比较大的数组没法也没法实现广度优先搜索的作用或者功能,所以就有可能会出现数组越界,非法访问的问题。

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值