1. 程式人生 > >NYOJ 58 最少步數 (深搜)

NYOJ 58 最少步數 (深搜)

1.遞迴的邊界:
走到終點座標, 即(x == x2 && y == y2);
2.遞迴進行的條件:
for迴圈的 4個方向(定義了一個方向陣列move)進行遞迴:
判斷條件:若為路 && 未標記 && 不越界, 則繼續遞迴;即(A[x][y] == 0 && flag[x][y] == 0 && x >= 0 && x <= 8 && y >= 0 && y <= 8)
在走的過程中,要注意標記和清除走過的點,還原走過的位置。
程式碼:


#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int A[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 flag[9][9];//flag標記陣列;
int min;
typedef struct item
{
	int x;
	int y;
} dir;
dir move[4] = {1, 0, 0, -1, -1, 0, 0, 1};//方向陣列;
void walking(int x, int y, int x2, int y2,int sum) { int i; if(x==x2 && y==y2) { //printf("sum=%d\n", sum); if(sum < min) min = sum; return ; } for(i=0; i<4; i++) { x = x + move[i].x; y = y + move[i].y; //printf("x=%d y=%d\n",x,y); if(x>=0&&x<=8 && y>=0&&y<=8 && A[x][y]==0 && flag[x][y]==0) { flag[x][y] = 1; //printf("x=%d y=%d\n",x,y); walking(x, y, x2, y2, sum+1); flag[x][y] = 0; } //@important 不論是否走過,是否能走,都要回溯
x = x - move[i].x; y = y - move[i].y; } } int main(void) { int n; int a, b, c, d; scanf("%d", &n); while(n--) { memset(flag, 0, sizeof(flag)); min = 0x7FFFFFFF; scanf("%d %d %d %d", &a, &b, &c, &d); walking(a, b, c, d, 0); printf("%d\n", min); } return 0; }

相關推薦

NYOJ 58 最少步數 ()

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

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

//修改版#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,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 27 水池數目 或廣

題目很簡單是最基礎的搜尋題 首先是深搜寫法,遞迴 #include<stdio.h> #include<stdlib.h> int m[100][100],a,b; int f[4][2]={{-1,0},{0,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,

NYOJ58 最少步數】+【廣

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

DFS && BFS 最少步數nyoj 58

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

poj3009最小步數

 本題是用深搜求兩點之間的最短路的基本應該,不過形式比較新,起初我用的是廣搜,所有資料和discuss上的資料都過了卻不能AC,無奈只好求助深搜。廣搜的bug可能是併發前進時於障礙物相撞後障礙物消失,可能應該是併發前進時相互之間影響了吧。 還有就是我原來用的是#include