今天做题时再一次卡在了memset上
本来是一道bfs的水题
但由于vis是二维数组,memset是用来赋值字节
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法[1] 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#define N 1005
using namespace std;
char a[N][N];
int n,m;
int vis[N][N];
struct node
{
int time,x,y;
};
int step[4][2]={1,0,0,1,-1,0,0,-1};
void bfs(int sx,int sy)
{
memset(vis,0,sizeof(vis));
queue<node >q;
vis[sx][sy]=1;
struct node cur,next;
cur.time=0;
cur.x=sx;
cur.y=sy;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int xx=cur.x+step[i][0];
int yy=cur.y+step[i][1];
if(xx>=0 && xx<n && yy>=0 && yy<m && a[xx][yy]!='T' && vis[xx][yy]==0)
{
vis[xx][yy]=cur.time+1;
next.x=xx;
next.y=yy;
next.time=cur.time+1;
q.push(next);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int sx,sy,rx,ry;
int x[N*N],y[N*N];
int k=0;
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
for(int j=0;j<m;j++)
{
if(a[i][j]=='E')
{
sx=i;
sy=j;
}
else if(a[i][j]=='S')
{
rx=i;
ry=j;
}
else if(a[i][j]>'0' && a[i][j]<='9')
{
x[k]=i;
y[k++]=j;
}
}
}
bfs(sx,sy);
int ans=0;
for(int i=0;i<k;i++)
{
if(vis[x[i]][y[i]] <= vis[rx][ry] &&vis[x[i]][y[i]] )
ans+=a[x[i]][y[i]]-'0';
}
printf("%d\n",ans);
}