Problem G: G-险恶逃生II
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 27 Solved: 5
[ Submit][ Status][ Web Board]
Description
Input
Output
Sample Input
5 7
000E0T3
T0TT0T0
010T0T0
2T0T0T0
0T0S000
1 4
SE23
Sample Output
3
2
HINT
#include <iostream>
#include <cstring>
#define size 1000
using namespace std;
char map[1011][1011];
int res[1011][1011];
int x1,x2,y1,y2,n,m;
struct point
{
int x,y;
} r[size*size+11];
int dis[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
void dfs()
{
int i,tail,head,xx,yy,x11,y11;
memset(res,-1,sizeof(res));
res[x1][y1]=0;
r[0].x=x1;
r[0].y=y1;
tail=1;
head=0;
while(tail != head)
{
x11=r[head].x;
y11=r[head].y;
for(i=0; i<4; i++)
{
xx=x11+dis[i][0];
yy=y11+dis[i][1];
if(map[xx][yy]!='T'&&res[xx][yy]==-1)
{
r[tail].x=xx;
r[tail].y=yy;
res[xx][yy] = 1 + res[x11][y11];
tail++;
}
}
head++;
}
}
int main()
{
int i,j;
int num,max=0;
while(cin>>m>>n)
{
for(i=0; i<=n+1; i++)
map[0][i]=map[m+1][i]='T';
for(i=0; i<=m+1; i++)
map[i][0]=map[i][n+1]='T';
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
{
cin>>map[i][j];
if(map[i][j]=='E')
{
x1=i;
y1=j;
}
if(map[i][j]=='S')
{
x2=i;
y2=j;
}
}
dfs();
num=res[x2][y2];
max=0;
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
if(map[i][j]>'0'&&map[i][j]<='9')
if(res[i][j]<=num&&res[i][j]!=-1)
max+=map[i][j]-'0';
cout<<max<<endl;
}
return 0;
}
针对4楼前博文代码未AC原因分析:
第一次错误提示 :
正确输出:0,我的输出:36
分析,从错误原因来看,应当是没有考虑到特殊情况造成的,仔细考虑后发现,由于在广度搜索中用 -1打表,所以在怪兽找不到出口时,当前的表格数据为-1.然而却符合了if(map[i][j]>'0'&&map[i][j]<='9'&& res[i][j]<=num)的判断,于是在判断中多加了个&&res[i][j]!=-1. 特殊情况解决,进行特殊情况测试数据正确,于是将代码提交。但是!!!!更加腚疼的问题又来了~~~ ---runtime error!!!,估计是访问越界数组开小了,在周童辉大神的帮助分析下 发现 果真 点坐标开小了,于是果断把r[1011]开到了 r[1011*1011],成功AC~~~
1398


---已AC+错误分析&spm=1001.2101.3001.11974&articleId=45074263&d=1&t=3&u=699a55dc07d44427a788baacadbbed6a)

被折叠的 条评论
为什么被折叠?



