1. 程式人生 > >南陽58 最少步數

南陽58 最少步數

最少步數

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4
描述

這有一個迷宮,有0~8行和0~8列:

 1,1,1,1,1,1,1,1,1
 1,0,0,1,0,0,1,0,1
 1,0,0,1,1,0,0,0,1
 1,0,1,0,1,1,0,1,1
 1,0,0,0,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,0,0,0,1
 1,1,1,1,1,1,1,1,1

0表示道路,1表示牆。

現在輸入一個道路的座標作為起點,再如輸入一個道路的座標作為終點,問最少走幾步才能從起點到達終點?

(注:一步是指從一座標點走到其上下左右相鄰座標點,如:從(3,1)到(4,1)。)

輸入
第一行輸入一個整數n(0<n<=100),表示有n組測試資料;
隨後n行,每行有四個整數a,b,c,d(0<=a,b,c,d<=8)分別表示起點的行、列,終點的行、列。
輸出
輸出最少走幾步。
樣例輸入
2
3 1  5 7
3 1  6 7
樣例輸出
12
11
#include<stdio.h>
#include<string.h>
#include<queue>
#include<limits.h>
using std::queue;
int map[9][9]={
 1,1,1,1,1,1,1,1,1,
 1,0,0,1,0,0,1,0,1,
 1,0,0,1,1,0,0,0,1,
 1,0,1,0,1,1,0,1,1,
 1,0,0,0,0,1,0,0,1,
 1,1,0,1,0,1,0,0,1,
 1,1,0,1,0,1,0,0,1,
 1,1,0,1,0,0,0,0,1,
 1,1,1,1,1,1,1,1,1
 };
 int vis[9][9]; 
 struct Node
 {
    int x,y;
    int step;
 }end,cur,next;
 int x_move[]={0,0,1,-1};
 int y_move[]={1,-1,0,0};
 bool judge()
 {
 if(next.x>=0&&next.x<9&&next.y>=0&&next.y<9&&!map[next.x][next.y]) return 1;
 return 0;
 }
 void BFS()
 {
 	queue<Node>q;
 	for(int i=0;i<9;i++)
 	  for(int j=0;j<9;j++)
 	    vis[i][j]=INT_MAX;
 	while(!q.empty())q.pop();
    //printf("%d\n",q.front().step);
      cur.step=0;//當前步數要初始化,否則會在上一次的基礎上相加 
	  next=cur;
	  vis[cur.x][cur.y]=0;//記得將第一步初始化 
    for(int i=0;i<4;i++)
      {
      	next=cur;
	    next.x+=x_move[i];
	    next.y+=y_move[i];
	     if(vis[next.x][next.y]==INT_MAX&&!map[next.x][next.y])
	       {
		      next.step++;
		     vis[next.x][next.y]=next.step;
		     q.push(next);
		   }
	  }
	  while(!q.empty())//q.size();也可以 
	  {
	     cur=q.front();
	    // printf("%d ",cur.step);
	       q.pop();
		 for(int i=0;i<4;i++)
		  {
		      next=cur;
		     next.x+=x_move[i];
		     next.y+=y_move[i];
		     if(vis[next.x][next.y]==INT_MAX&&judge())
	       { 
		         next.step++;
	       	// if(vis[next.x][next.y]>next.step);
		         vis[next.x][next.y]=next.step;
		         //printf("%d ",vis[next.x][next.y]);
		     q.push(next);
		   }
		   
		  } 
	  }
	  printf("%d\n",vis[end.x][end.y]);
	   
 };
int main()
{
  int N;
  scanf("%d",&N);
  while(N--)
  {
  	scanf("%d%d%d%d",&cur.x,&cur.y,&end.x,&end.y);
  	BFS();
  	/*
    for(int i=0;i<9;i++)
    {
      for(int j=0;j<9;j++)
      {
	     printf("%d ",a[i][j]);
	  }
      printf("\n");
    }
   */
  }	
return 0;
} 



相關推薦

南陽58 最少步數

最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,0,

南陽理工OJ_題目58 最少步數

#include <iostream> #include <queue> #include <cstring> using namespace std; int bfs(); struct data { int x;

南陽理工58最少步數

最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,0,1,1,0,1

NYOJ 58 最少步數 (深搜)

1.遞迴的邊界: 走到終點座標, 即(x == x2 && y == y2); 2.遞迴進行的條件: for迴圈的 4個方向(定義了一個方向陣列move)進行遞迴: 判斷條件:若為路 && 未標記 && 不越界, 則繼續遞迴;

NYOJ 58 最少步數問題

//修改版#include<stdio.h> #include<string.h> int arr[9][9] = { 1,1,1,1,1,1,1,1,1, 1,0,0

NYOJ 題目58 最少步數(BFS)

 最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,0,

NYOJ 58 最少步數

(一)深搜法: 1.遞迴的邊界: 走到終點座標, 即(x == x2 && y == y2); 2.遞迴進行的條件: for迴圈的 4個方向(定義了一個方向陣列move)進行遞迴: 判斷條件:若為路 && 未標記 && 不越

nyoj 58 最少步數(BFS)

最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,0,1,

NYOJ 58 最少步數(廣搜入門經典)

最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,

nyoj-題目58-最少步數【DFS】

最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,

nyoj 58-最少步數

最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,

nyoj-58 最少步數

最少步數 時間限制:3000 ms | 記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0

58 最少步數【bfs】

最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,

最少步數 NYOJ 58

 最少步數 時間限制:3000 ms | 記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,

DFS && BFS 最少步數(nyoj 58

最少步數 最少步數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0

POJ 3126 Prime Path【從一個素數變為另一個素數的最少步數/BFS】

lan mem 奇數 offices ring finance primes iostream int Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26475 Accepted:

【多次過】Lintcode 1231. 使陣列元素相同的最少步數

給定一個大小為n的非空整數陣列,找出使得陣列中所有元素相同的最少步數,其中一步被定義為將陣列中n - 1個元素加一。 樣例 輸入: [1,2,3] 輸出: 3 說明: 只需要三步即可(每一步將其中兩個元素加一): [1,2,3] => [2,3,3] =

有自己的程式碼--題目:給定一個數組,裡面全是正整數。數字大小表示這一步最多可以向後移動幾個節點。總是從陣列第一個元素開始移動。問如何移動,可以以最少步數移動到最後一個節點。

原文:https://yq.aliyun.com/articles/547799 描述: 題目:給定一個數組,裡面全是正整數。數字大小表示這一步最多可以向後移動幾個節點。總是從陣列第一個元素開始移動。問如何移動,可以以最少步數移動到最後一個節點。 例如:[3,4,2

最少步數 (bfs最短路徑)

描述 這有一個迷宮,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,0,1,1,0,1,1  1,0,0,0,0,1,0,0,1  1,1,0,1,0,1,0,0