user-0 提问: hdu1242 Runtime Error (ACCESS_VIOLATION)什么情况

回复:
user: user-1
content: 引用 4 楼 IDJD_LPY 的回复:[quote=引用 3 楼 user-1 的回复:]         v1 = h.front();         h.pop();         for ( i = 0; i < 4; i++)         {             v2.x = v1.x + dir[i][0];             v2.y = v1.y + dir[i][1];  这块v2.x及v2.y有可能出现小于0的情况。你没有判断 是的，只是一个问题。。但是改完之后怎么直接WA了[/quote]  for ( i = 0; i < 4; i++)         {             v2.x = v1.x + dir[i][0];             v2.y = v1.y + dir[i][1];             if (v2.x == a.x&&v2.y==a.y)             {                 ax = v1.x; ay = v1.y;                 return true;             } 这块你找到一个结果就返回。但这个结果未必是最小时间如下测试用例： 7 8 r.xxxa#. ........ #..#x... ..#..#.# #...##.. .#...... ........ 正确答案应该是7，面你的答案应该是8

user: user-0
content: 引用 3 楼 user-1 的回复:        v1 = h.front();         h.pop();         for ( i = 0; i < 4; i++)         {             v2.x = v1.x + dir[i][0];             v2.y = v1.y + dir[i][1];  这块v2.x及v2.y有可能出现小于0的情况。你没有判断 是的，只是一个问题。。但是改完之后怎么直接WA了

user: user-1
content: v1 = h.front();         h.pop();         for ( i = 0; i < 4; i++)         {             v2.x = v1.x + dir[i][0];             v2.y = v1.y + dir[i][1];  这块v2.x及v2.y有可能出现小于0的情况。你没有判断

user: user-0
content: 感觉不是数组越界，开得再大还是re

user: user-1
content: #include<stdio.h> #include<iostream> #include<queue> using namespace std;  int N,M; char map[210][210]; int ex,ey; int result; int flag[210][210];  int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};  struct point{        int x,y;        int time; };  bool check(int x,int y){      if(x>=0&&y>=0&&x<N&&y<M)return true;      return false; } int Search(int sx,int sy){     point t1,t2;     queue<point> Q;     t1.x=sx;     t1.y=sy;     t1.time=0;     Q.push(t1);     while(!Q.empty()){                  t1=Q.front();         if(t1.x==ex&&t1.y==ey){            if(result>t1.time)result=t1.time;         }         Q.pop();         for(int i=0;i<4;i++){                 int dx=t1.x+dir[i][0];                 int dy=t1.y+dir[i][1];                 if(check(dx,dy)&&map[dx][dy]=='.'){                     t2.x=dx;                     t2.y=dy;                     t2.time=t1.time+1;                     if(t2.time<flag[t2.x][t2.y]&&t2.time<=result){                         flag[t2.x][t2.y]=t2.time;                         Q.push(t2);                     }                 }                 else if(check(dx,dy)&&map[dx][dy]=='x'){                      t2.x=dx;                      t2.y=dy;                      t2.time=t1.time+2;                      if(t2.time<flag[t2.x][t2.y]&&t2.time<=result){                         flag[t2.x][t2.y]=t2.time;                         Q.push(t2);                     }                 }         }     }     return result; }  int main(){     int sx,sy;     int i,j;     while(scanf("%d%d",&N,&M)!=EOF){         memset(flag,50000,sizeof(flag));         for(i=0;i<N;i++){                 cin>>map[i];         }         result=500000;         for(i=0;i<N;i++){            for(j=0;j<M;j++){              if(map[i][j]=='r'){                 sx=i;                 sy=j;              }              else if(map[i][j]=='a'){                   map[i][j]='.';                   ex=i;                   ey=j;              }            }         }         int t=Search(sx,sy);         if(t==500000){           printf("Poor ANGEL has to stay in the prison all his life.\n");         }         else{              printf("%d\n",t);         }     }     return 0; } AC代码你参考下。我的做法是每次找到一个答案后，判断该值是否比已经找到的一个解还小，如果有就更新最小值

user: user-0
content: 现在是  #define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<string.h> #include<queue> using namespace std; char map[400][400]; int visit[400][400], step[400][400]; int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; int n, m,ax,ay; int i, j,z; bool t; struct node { 	int x, y; }; node a, r, v1, v2,v0; queue<node>h; bool search() { 	h.push(r); 	step[r.x][r.y] = 0; 	visit[r.x][r.y] = 1; 	while (h.empty()!=true) 	{ 		v1 = h.front(); 		h.pop(); 		for ( i = 0; i < 4; i++) 		{ 			v2.x = v1.x + dir[i][0]; 			v2.y = v1.y + dir[i][1]; 			if (v2.x>=0&&v2.y>=0) 			{ 				 				if (v2.x == a.x&&v2.y == a.y) 				{ 					ax = v1.x; ay = v1.y; 					return true; 				} 				if (visit[v2.x][v2.y] == 2&&v1.x==v0.x&&v1.y==v0.y) 				{ 					h.push(v2); 					visit[v2.x][v2.y] = 1; 					step[v2.x][v2.y] = step[v2.x][v2.y] + 1; 				} 				if (v2.x < n&&v2.y < m&& map[v2.x][v2.y] != '#'&&visit[v2.x][v2.y] == 0) 				{ 					 					if (map[v2.x][v2.y] == 'x') 					{ 						h.push(v1); 						visit[v2.x][v2.y] = 2; 						v0 = v1; 						step[v2.x][v2.y] = step[v1.x][v1.y] + 1; 					} 					if(map[v2.x][v2.y] == '.') 					{ 						h.push(v2); 					    visit[v2.x][v2.y] = 1; 						step[v2.x][v2.y] = step[v1.x][v1.y] + 1; 					} 				} 			} 		} 	} 	return false; } int main() { 	while (scanf("%d%d", &n, &m) != EOF) 	{ 		memset(map, 0, sizeof(map)); 		memset(visit, 0, sizeof(visit)); 		memset(step, 0, sizeof(step)); 		for (i = 0; i < n; i++) 		{ 			scanf("%s", map[i]); 			for (j = 0; j < m; j++) 			{ 				 				if (map[i][j] == 'a') 				{ 					a.x = i; a.y = j;  				} 				if (map[i][j] == 'r') 				{ 					r.x = i; r.y = j; 				} 			} 		} 		t = search(); 		while (h.empty() != true) 		{ 			h.pop(); 		} 		if (t == true) 		{ 			printf("%d\n", step[ax][ay]+1); 		} 		if (t == false) 		{ 			printf("Poor ANGEL has to stay in the prison all his life.\n"); 		} 	} 	return 0; }  刚刚改了几个问题，一个是循环一次后队列清零，一个是算法逻辑部分错误，但不知道为什么还是WA，有点崩溃。。

user: user-0
content: 引用 5 楼 user-1 的回复:[quote=引用 4 楼 IDJD_LPY 的回复:] [quote=引用 3 楼 user-1 的回复:]         v1 = h.front();         h.pop();         for ( i = 0; i < 4; i++)         {             v2.x = v1.x + dir[i][0];             v2.y = v1.y + dir[i][1];  这块v2.x及v2.y有可能出现小于0的情况。你没有判断 是的，只是一个问题。。但是改完之后怎么直接WA了[/quote]  for ( i = 0; i < 4; i++)         {             v2.x = v1.x + dir[i][0];             v2.y = v1.y + dir[i][1];             if (v2.x == a.x&&v2.y==a.y)             {                 ax = v1.x; ay = v1.y;                 return true;             } 这块你找到一个结果就返回。但这个结果未必是最小时间如下测试用例： 7 8 r.xxxa#. ........ #..#x... ..#..#.# #...##.. .#...... ........ 正确答案应该是7，面你的答案应该是8[/quote] 改完了，还是WA。。

user: user-0
content: 运行样例正确，但一直re，不知道为什么