-
- #include
- #include
- #include
- #include
- #include
- using namespace std ;
- int a[100][100] , vis[100][100] = {0} ;
- int m , n ;
- struct dot{
- int x ;
- int y ;
- int step ;
- };
- int dx[] = {-1,0,1,0} ;
- int dy[] = {0,1,0,-1} ;
- bool is_ok(dot cur) {
- if(cur.x < 0|| cur.x >= m || cur.y < 0 || cur.y >= n )
- return 0 ;
- return 1 ;
- }
- int bfs() {
- dot A ;
- A.x = 0 ;
- A.y = 0 ;
- A.step = 0 ;
- vis[0][0] = 1 ;
- queue q ;
- while(!q.empty())
- q.pop() ;
- q.push(A) ;
- while(!q.empty()) {
- dot cur = q.front() ;
- q.pop();
- if(cur.x == m-1 && cur.y == n-1)
- return cur.step ;
- dot next ;
- for(int i = 0 ; i < 4 ; i++) {
- next.x = cur.x + dx[i] ;
- next.y = cur.y + dy[i] ;
- next.step = cur.step + 1 ;
- if(is_ok(next)&&a[next.x][next.y] != 1&&vis[next.x][next.y] != 1) {
- q.push(next) ;
- vis[next.x][next.y] = 1 ;
- }
- }
- }
- return 0 ;
- }
- int main() {
- scanf("%d%d",&m,&n) ;
- int i , j , k ;
- for(i = 0 ; i < m ; i++)
- for(j = 0 ; j < n ; j++)
- scanf("%d",&a[i][j]) ;
- int step = bfs() ;
- printf("%d\n",step) ;
- return 0 ;
- }
当节点足够多时,有可能会超出队列的容量,程序在运行时就会出错,所以也可以使用数组代替队列。
-
- #include
- #include
- #include
- #include
- using namespace std ;
- int a[100][100] , vis[100][100] = {0} ;
- int m , n ;
- struct dot{
- int x ;
- int y ;
- int step ;
- }d[10000];
- int dx[] = {-1,0,1,0} ;
- int dy[] = {0,1,0,-1} ;
- bool is_ok(dot cur) {
- if(cur.x < 0|| cur.x >= m || cur.y < 0 || cur.y >= n )
- return 0 ;
- return 1 ;
- }
- int bfs() {
- dot A ;
- A.x = 0 ;
- A.y = 0 ;
- A.step = 0 ;
- vis[0][0] = 1 ;
- int head = 0 , tail = 0 ;
- d[tail++] = A ;
- while(head < tail) {
- dot cur = d[head++] ;
- if(cur.x == m-1 && cur.y == n-1)
- return cur.step ;
- dot next ;
- for(int i = 0 ; i < 4 ; i++) {
- next.x = cur.x + dx[i] ;
- next.y = cur.y + dy[i] ;
- next.step = cur.step + 1 ;
- if(is_ok(next)&&a[next.x][next.y] != 1&&vis[next.x][next.y] != 1) {
- d[tail++] = next ; ;
- vis[next.x][next.y] = 1 ;
- }
- }
- }
- return 0 ;
- }
- int main() {
- scanf("%d%d",&m,&n) ;
- int i , j , k ;
- for(i = 0 ; i < m ; i++)
- for(j = 0 ; j < n ; j++)
- scanf("%d",&a[i][j]) ;
- int step = bfs() ;
- printf("%d\n",step) ;
- return 0 ;
- }
如果想输出所走的路径,可以先记录各个节点的父节点位置,然后递归输出路径:
-
- #include
- #include
- #include
- #include
- using namespace std ;
- int a[100][100] , vis[100][100] = {0} ;
- int m , n ;
- struct dot{
- int x ;
- int y ;
- int step ;
- }d[10000];
- int pre[10000] ;
- int dx[] = {-1,0,1,0} ;
- int dy[] = {0,1,0,-1} ;
- bool is_ok(dot cur) {
- if(cur.x < 0|| cur.x >= m || cur.y < 0 || cur.y >= n )
- return 0 ;
- return 1 ;
- }
- void print(int x) { //递归输出
- int t = pre[x] ;
- if(t == 0) {
- printf("(0,0)\n") ; //先输出父节点位置
- printf("(%d,%d)\n" ,d[x].x , d[x].y) ; //再输出本身位置
- return ;
- }
- print(t) ; //先输出父节点位置
- printf("(%d,%d)\n" ,d[x].x , d[x].y) ; //再输出本身位置
- }
- int bfs() {
- dot A ;
- A.x = 0 ;
- A.y = 0 ;
- A.step = 0 ;
- vis[0][0] = 1 ;
- int head = 0 , tail = 0 ;
- d[tail++] = A ;
- while(head < tail) {
- dot cur = d[head++] ;
- if(cur.x == m-1 && cur.y == n-1) {
- print(head-1) ;
- return cur.step ;
- }
- dot next ;
- for(int i = 0 ; i < 4 ; i++) {
- next.x = cur.x + dx[i] ;
- next.y = cur.y + dy[i] ;
- next.step = cur.step + 1 ;
- if(is_ok(next)&&a[next.x][next.y] != 1&&vis[next.x][next.y] != 1) {
- pre[tail] = head - 1 ; //记录该节点的父节点所在位置
- d[tail++] = next ; ;
- vis[next.x][next.y] = 1 ;
- }
- }
- }
- return 0 ;
- }
-
- int main() {
- scanf("%d%d",&m,&n) ;
- int i , j , k ;
- for(i = 0 ; i < m ; i++)
- for(j = 0 ; j < n ; j++)
- scanf("%d",&a[i][j]) ;
- int step = bfs() ;
- printf("%d\n",step) ;
- return 0 ;
- }