1. 程式人生 > >資料結構實驗之棧與佇列十:走迷宮(DFS)

資料結構實驗之棧與佇列十:走迷宮(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