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 |
一直是Memory Limit Exceeded,求大神帮忙看看呗?bfs+dfs#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