hdu1026(linxingqiangglai)
2015-06-24 23:41
393 查看
这题用到的是广度优先搜索,能够最先到达最优解,原来以为是如果不注意会出现暴力搜索,但是后面和同学交流以后,发现是我能力有限,不是那个原因,
主要的原因是因为我用的是不是递归方式来广度搜索,用的是数组来实现广度优先搜索,所以会出现数组非法访问的问题,这对我来说确实是一个教训。
#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;
}
/*
红色部分要特别注意有没有等号的区别,如果没有等号就会出现路径太多,以至于一个比较大的数组没法也没法实现广度优先搜索的作用或者功能,所以就有可能会出现数组越界,非法访问的问题。
*/
主要的原因是因为我用的是不是递归方式来广度搜索,用的是数组来实现广度优先搜索,所以会出现数组非法访问的问题,这对我来说确实是一个教训。
#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;
}
/*
红色部分要特别注意有没有等号的区别,如果没有等号就会出现路径太多,以至于一个比较大的数组没法也没法实现广度优先搜索的作用或者功能,所以就有可能会出现数组越界,非法访问的问题。
*/
相关文章推荐
- 1216: 斐波那契数列
- 基于Qt有限状态机人工智能的一种实现及改进方法
- Contains Duplicate II
- Climbing Stairs
- Mysql_Faq: ERROR 1396 (HY000): Operation CREATE USER failed for ‘username’@’hostname’
- Leetcode 219 Contains Duplicate II
- 逆向怎么玩 - 动态调试jetBrains CLion实录
- container_of ( )
- LeetCode 217. Contains Duplicate
- UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)
- Factorial Trailing Zeroes
- 关于类似Gmail邮件撤销功能实现初探
- Leetcode 220 Contains Duplicate III
- NSBundle的使用,注意mainBundle和Custom Bundle的区别
- JetBrain WebStorm 注册码
- leetcode-11Container With Most Water
- Error:Flash Download Failed-"Cortex-M3"
- TrinityCore BossAI
- Thunderbird Mail 支持 Microsoft Exchange
- 地形算法 Fractal Terrain Generation