SDUT-2449_数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫

Time Limit: 1000 ms Memory Limit: 65536 KiB

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

比较疑惑这道题为什么会分到这里,这是一道简单的DFS题,上学期的动态规划有类似的题目,图的知识点,可以去看看相应知识。
另外这道题没用栈和队列

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int s[10][10],f[10][10],num,n,m;
int next[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};

void DFS(int x,int y)
{
    if(x==n-1&&y==m-1)
    {
        num++;
        return;
    }
    int dx,dy,i;
    for(i=0;i<4;i++)
    {
        dx = x + next[i][0];
        dy = y + next[i][1];
        if(dx>=0&&dy>=0&&dx<n&&dy<m&&s[dx][dy]!=1)
        {
            if(!f[dx][dy])
            {
                f[dx][dy] = 1;
                DFS(dx,dy);
                f[dx][dy] = 0;
            }
        }
    }
}

int main()
{
    int i,j,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
            {
                f[i][j] = 0;
                scanf("%d",&s[i][j]);
            }
        num = 0;
        f[0][0] = 1;
        DFS(0,0);
        printf("%d\n",num);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/luoxiaoyi/p/9748067.html

时间: 2024-08-02 11:02:24

SDUT-2449_数据结构实验之栈与队列十:走迷宫的相关文章

SDUT 2449 数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发了一笔横财,开了一家停车场.由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多.当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先 进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆.现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表

数据结构实验之栈与队列九:行编辑器

数据结构实验之栈与队列九:行编辑器 Description 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

数据结构实验之栈与队列十一:refresh的停车场

Problem Description refresh最近发了一笔横财,开了一家停车场.由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多.当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先 进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆.现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道, Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场).假设便

SDUT OJ 数据结构实验之栈四:括号匹配

#include<iostream> #include<stdio.h> using namespace std; int main() { char a[51],b[51]; int i,top; while(gets(a)!=NULL) { top=-1; for(i=0;a[i]!='\0';i++) { if(a[i]=='{'||a[i]=='['||a[i]=='(') { b[++top]=a[i]; } else if(a[i]=='}') { if(b[top]=

SDUT OJ 数据结构实验之栈二:一般算术表达式转换成后缀式

#include<iostream> using namespace std; int youxian(char s) { if(s=='+'||s=='-') return 1; else if(s=='*'||s=='/') return 2; else if(s=='(') return 3; else if(s==')') return 4; } int main() { int top=0; char s,b[110]; while(cin>>s && s

SDUT OJ 1479 数据结构实验之栈:行编辑器

数据结构实验之栈:行编辑器 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做 法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当