Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:一直是Memory Limit Exceeded,求大神帮忙看看呗?bfs+dfsIn Reply To:一直是Memory Limit Exceeded,求大神帮忙看看呗?bfs+dfs Posted by:zhangdanfeng at 2017-12-26 15:08:05 > #include "cstdio" > #include "vector" > #include "cstring" > #include "queue" > > using namespace std; > char g[43][43]; > int n,m; > int s_x; > int s_y; > int t_x; > int t_y; > //left > int move_leftx[4][4] = {{0,-1,0,+1},{-1,0,+1,0},{0,+1,0,-1},{+1,0,-1,0}}; > int move_lefty[4][4] = {{-1,0,+1,0},{0,+1,0,-1},{+1,0,-1,0},{0,-1,0,+1}}; > > int move_leftd[4][4] = {{3,0,1,2},{0,1,2,3},{1,2,3,0},{2,3,0,1}}; > int move_rightd[4][4] = {{1,0,3,2},{2,1,0,3},{3,2,1,0},{0,3,2,1}}; > > //right > int move_rightx[4][4] = {{0,-1,0,+1},{+1,0,-1,0},{0,+1,0,-1},{-1,0,+1,0}}; > int move_righty[4][4] = {{+1,0,-1,0},{0,+1,0,-1},{-1,0,+1,0},{0,-1,0,+1}}; > //bfs > int move_bfs[][2] = {{-1,0},{+1,0},{0,-1},{0,+1}}; > bool visited[43][43]; > int dist[43][43]; > bool access(int x,int y) > { > if(x >= 0 && x < m && y >= 0 && y < n && g[x][y] != '#') > { > return true; > } > return false; > } > bool access_bfs(int x,int y) > { > if(x >= 0 && x < m && y >= 0 && y < n && g[x][y] != '#' && !visited[x][y]) > { > return true; > } > return false; > } > int dfs_left(int rx,int ry,int d,int num) > { > if(rx == t_x && ry == t_y) > { > return num+1; > } > for(int i = 0 ; i < 4 ; i++) > { > int nx = rx + move_leftx[d][i]; > int ny = ry + move_lefty[d][i]; > if(access(nx,ny)) > { > int nd ; > nd = move_leftd[d][i]; > return dfs_left(nx,ny,nd,num+1); > > } > } > > } > > int dfs_right(int rx,int ry,int d,int num) > { > if(rx == t_x && ry == t_y) > { > return num+1; > } > for(int i = 0 ; i < 4 ; i++) > { > int nx = rx + move_rightx[d][i]; > int ny = ry + move_righty[d][i]; > if(access(nx,ny)) > { > int nd ; > nd = move_rightd[d][i]; > return dfs_right(nx,ny,nd,num+1); > > > } > } > > } > int bfs() > { > memset(visited,false,sizeof(visited)); > memset(dist,0,sizeof(dist)); > queue<int> qx; > queue<int> qy; > qx.push(s_x); > qy.push(s_y); > visited[s_x][s_y] = true; > dist[s_x][s_y] = 1; > while(!qx.empty() && !qy.empty()) > { > int x = qx.front(); > int y = qy.front(); > qx.pop(); > qy.pop(); > if(x == t_x && y == t_y) > { > return dist[x][y]; > } > for(int i = 0 ;i < 4 ; i++) > { > int nx = x + move_bfs[i][0]; > int ny = y + move_bfs[i][1]; > if(access_bfs(nx,ny)) > { > dist[nx][ny] = dist[x][y]+1; > qx.push(nx); > qy.push(ny); > } > } > } > } > int initD() > { > if(s_x == m-1) > return 0; > if(s_x == 0) > return 2; > if(s_y == 0) > return 1; > if(s_y == n-1) > return 3; > > } > int main() > { > int t; > scanf("%d",&t); > while(t--) > { > > scanf("%d %d",&n,&m); > > for(int i = 0 ;i < m ; i++) > { > char s[60]; > scanf("%s",s); > for(int j = 0 ; j < n ; j++) > { > g[i][j] = s[j]; > if(g[i][j] == 'S') > { > s_x = i; > s_y = j; > } > if(g[i][j] == 'E') > { > t_x = i; > t_y = j; > } > } > } > int d = initD(); > int r1 = dfs_left(s_x,s_y,d,0); > int r2 = dfs_right(s_x,s_y,d,0); > int r3 = bfs(); > printf("%d %d %d\n",r1,r2,r3); > > } > //while(1) > //{} > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator