1. 程式人生 > >NYOJ 58 最少步數問題

NYOJ 58 最少步數問題

//修改版
#include<stdio.h>
#include<string.h>
int arr[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 book[9][9];
int Next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int starx, stary, endx, endy;
int min_step = 999999;
void DFS(int x, int y,int step)
{
	if(x == endx && y == endy)
	{
		if(step < min_step)
		min_step = step;
		return ;
	}
	int i,tempx,tempy;
	for(i = 0;i<4;i++)
	{
		tempx = x + Next[i][0];
		tempy = y + Next[i][1];
		if(tempx < 1 || tempx > 8 || tempy < 1 || tempy > 8)
		continue;
		if(arr[tempx][tempy] == 0 && book[tempx][tempy] == 0)
		{
			book[tempx][tempy] = 1;
			DFS(tempx,tempy,step + 1);
			book[tempx][tempy] = 0;
		}
	}
	return ;
	
}
int main()
{
	int N;
	scanf("%d",&N);
	while(N--)
	{
		min_step = 999999;
		scanf("%d %d %d %d",&starx,&stary,&endx,&endy);
		memset(book, 0, sizeof(book));
		book[starx][stary] = 1;
		DFS(starx,stary,0);
		printf("%d\n",min_step);
	}
	return 0;
 } 

//兩個月後重新看這個感覺簡單了很多,優化後:

#include<cstdio>
#define min(x,y) x>y?y:x
int arr[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 a, b, ea, eb, min_step;
void dfs(int x, int y, int step)
{
	if(arr[x][y])
	return ;
	if(x == ea && y == eb)
	{
		min_step = min(step,min_step);
		return ;
	}
	arr[x][y] = 1;
	dfs(x+1,y,step+1);
	dfs(x,y+1,step+1);
	dfs(x-1,y,step+1);
	dfs(x,y-1,step+1);
	arr[x][y] = 0;
}
int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		min_step = 0xfffff;
		scanf("%d%d%d%d",&a,&b,&ea,&eb);
		dfs(a, b, 0);
		printf("%d\n",min_step);
	}
}


相關推薦

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 最少步數

(一)深搜法: 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-最少步數

最少步數 時間限制: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

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-最少步數【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 54 最少步數

廣搜問題,每個步驟的含義都寫在程式碼裡面了。歡迎大家相互交流, 程式碼: #include<iostream> #include<stdio.h> #include<queue> #include<cstring> usi

南陽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;

NYOJ 54最少步數

這道題關鍵的就是怎麼用佇列去儲存訪問的節點,用結構體,在用c++的佇列,其他的就是基本的bfs 別人的程式碼 #include<iostream> #include<stdio.h> #include<queue> #include&l

南陽理工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

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

NYoj最少步數(DFS)

描述 這有一個迷宮,有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,

NYOJ 58 最小步數

 最小步數 題目資訊:這道題就是一個簡單的迷宮搜尋,可以用佇列作簡單模擬。 原始碼: #include<stdio.h> #include<string.h> #include<queue> using namespace std;

nyoj 46-最少乘法次數 (遞推)

sca C/C++ ron content itl 輸入 一次 align IV 46-最少乘法次數 內存限制:64MB 時間限制:1000ms