資料結構實驗之棧與佇列十:走迷宮(DFS)
Problem Description
一個由n * m 個格子組成的迷宮,起點是(1, 1), 終點是(n, m),每次可以向上下左右四個方向任意走一步,並且有些格子是不能走動,求從起點到終點經過每個格子至多一次的走法數。
Input
第一行一個整數T 表示有T 組測試資料。(T <= 110)
對於每組測試資料:
第一行兩個整數n, m,表示迷宮有n * m 個格子。(1 <= n, m <= 6, (n, m) !=(1, 1) ) 接下來n 行,每行m 個數。其中第i 行第j 個數是0 表示第i 行第j 個格子可以走,否則是1 表示這個格子不能走,輸入保證起點和終點都是都是可以走的。
任意兩組測試資料間用一個空行分開。
Output
對於每組測試資料,輸出一個整數R,表示有R 種走法。
Sample Input
3
2 2
0 1
0 0
2 2
0 1
1 0
2 3
0 0 0
0 0 0
Sample Output
1
0
4
#include <bits/stdc++.h> using namespace std; int visit[10][10]; int a[10][10]; int n,m,sum; void dfs(int x,int y)//x為橫座標,y是縱座標 { //遍歷結束的條件 if(x<1||x>n||y<1||y>m||a[x][y]==1) return; if(x==n&&y==m){ sum++; return; } //從4個方向開始遍歷 if(!visit[x][y]){ visit[x][y]=1; dfs(x+1,y); dfs(x,y+1); dfs(x-1,y); dfs(x,y-1); //將visit[x][y]置零,使其他方向的遍歷能夠繼續 visit[x][y]=0; } } int main() { int t; cin>>t; while(t--){ memset(a,0,sizeof(a)); memset(visit,0,sizeof(visit)); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } sum=0; dfs(1,1); cout<<sum<<endl; } return 0; }
相關推薦
資料結構實驗之棧與佇列十:走迷宮(DFS)
Problem Description 一個由n * m 個格子組成的迷宮,起點是(1, 1), 終點是(n, m),每次可以向上下左右四個方向任意走一步,並且有些格子是不能走動,求從起點到終點經過每個格子至多一次的走法數。 Input 第一行一個整數T
資料結構實驗之棧與佇列十:走迷宮
Problem Description 一個由n * m 個格子組成的迷宮,起點是(1, 1), 終點是(n, m),每次可以向上下左右四個方向任意走一步,並且有些格子是不能走動,求從起點到終點經過每個
資料結構實驗之棧與佇列四:括號匹配(SDUT 2134)
#include <bits/stdc++.h> using namespace std; typedef long long ll; char s[100]; char a[100]; int main() { int i,j,k,f,top,len; while(
資料結構實驗之棧與佇列二:一般算術表示式轉換成字尾式(SDUT 2132)
題目連結 #include <bits/stdc++.h> using namespace std; typedef long long ll; int ok(char ch, char sh) { if(sh == '(')return 1; if((ch ==
資料結構實驗之棧與佇列六:下一較大值(二)(SDUT 3333)
#include <bits/stdc++.h> using namespace std; int a[1000006]; int b[1000006]; int sta[100006]; int main() { int t,n,i,j,top; while(~sc
資料結構實驗之棧與佇列五:下一較大值(一)(SDUT 3332)
#include <bits/stdc++.h> using namespace std; int a[1005]; int main() { int t,n,i,j; while(~scanf("%d",&t)) { while(t-
資料結構實驗之棧與佇列三:字尾式求值(SDUT 2133)
題解:把每一步計算的答案再存在棧裡面,直到計算結束。 如果是運算元 那麼直接入棧;如果是運算子,那麼把棧裡面最頂部的兩個運算元拿出來進行運算,運算結果再放入到棧裡面,計算完所有的(#
資料結構實驗之棧與佇列五:下一較大值(一)
資料結構實驗之棧與佇列五:下一較大值(一) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 對於包含n(1<=n<=1000)個整數的序列,對於序列中的每一元素,
資料結構實驗之棧與佇列五:下一較大值(一,二)
資料結構實驗之棧與佇列五:下一較大值(一,二) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 對於包含n(1<=n<=1000)個整數的序列,對於序
資料結構實驗之棧與佇列七:出棧序列判定
Problem Description 給一個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入一個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。 例如序列1,2,3,4,5是某棧的壓入順序,序列4
資料結構實驗之棧與佇列六:下一較大值(二)(因為資料量大所以用棧來操作)
資料結構實驗之棧與佇列六:下一較大值(二) Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查詢
資料結構實驗之棧與佇列八:棧的基本操作
Problem Description 堆疊是一種基本的資料結構。堆疊具有兩種基本操作方式,push 和 pop。push一個值會將其壓入棧頂,而 pop 則會將棧頂的值彈出。現在我們就來驗證一下堆疊的
資料結構實驗之棧與佇列九:行編輯器
Problem Description 一個簡單的行編輯程式的功能是:接受使用者從終端輸入的程式或資料,並存入使用者的資料區。 由於使用者在終端上進行輸入時,不能保證不出差錯,因此,若在編輯程式中,“每接受一個字元即存入使用者資料區”的做法顯然不是最恰當的。較好
資料結構實驗之棧與佇列六:下一較大值(二)
Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查詢其位置之後第一個大於它的值,如果找到,輸出所找到的
資料結構實驗之棧與佇列一:進位制轉換(SDUT 2131)
題目連結 題解: 特判一下n==0的時候。 #include <bits/stdc++.h> using namespace std; int a[1000]; int main() {
資料結構實驗之棧與佇列一:進位制轉換
Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 輸入一個十進位制非負整數,將其轉換成對應的 R (2 <= R <= 9) 進位制數,並
資料結構實驗之棧與佇列八:棧的基本操作(new)
#include <stdio.h> #include <stdlib.h> typedef struct node { int *base; int *top; int stacksize; } sqstack;
[OJ.2131]資料結構實驗之棧與佇列一:進位制轉換
資料結構實驗之棧與佇列一:進位制轉換 Time Limit: 1000 ms
【OJ.2132】資料結構實驗之棧與佇列二:一般算術表示式轉換成字尾式
資料結構實驗之棧與佇列二:一般算術表示式轉換成字尾式 Time Limit: 1000 ms
資料結構實驗之棧與佇列四:括號匹配
#include <stdio.h> #include <stdlib.h> #include <string.h> #define Stackmax 100 #define Stackincrement 10 #define