SDUT 1157 小鼠迷宫问题(水题,DFS + 回溯)

小鼠迷宫问题

Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。

请编程对于给定的小鼠的迷宫,计算小鼠a通向小鼠b的所有最短道路。

输入

本题有多组输入数据,你必须处理到EOF为止。

每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。

接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。

最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。

输出

对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。

每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。

每组输出之间没有空行。

如果小鼠a无法通向小鼠b则输出“No Solution!”。

示例输入

8 8 3
3 3
4 5
6 6
2 1
7 7

示例输出

11
96

来源

NOI’2005福建省选手选拔赛

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

using namespace std;

struct node
{
    int x;
    int y;
}a,b;

int jx[] = {0,1,0,-1};
int jy[] = {1,0,-1,0};
int v[101][101];
int map[101][101];
int n,m,k;
int flag;
int ans;
int psum;

void DFS(int xx,int yy,int cnt)
{
    if(cnt>ans)
    {
        return ;
    }
    if(xx == b.x && yy == b.y)
    {
        if(cnt<ans)
        {
            flag = 1;
            ans = cnt;
            psum = 1;
        }
        else if(cnt == ans)
        {
            psum++;
        }
        return ;
    }
    for(int i=0;i<4;i++)
    {
        if(xx+jx[i]>=0 && xx+jx[i]<n && yy+jy[i]>=0 && yy+jy[i]<m && map[xx+jx[i]][yy+jy[i]] == 0 && v[xx+jx[i]][yy+jy[i]] == 0)
        {
            v[xx+jx[i]][yy+jy[i]] = 1;
            DFS(xx+jx[i],yy+jy[i],cnt+1);
            v[xx+jx[i]][yy+jy[i]] = 0;
        }
    }
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                map[i][j] = 0;
                v[i][j] = 0;
            }
        }
        int x,y;
        for(int i=0;i<k;i++)
        {
            scanf("%d%d",&x,&y);
            map[x][y] = 1;
        }
        ans = 99999999;
        flag = 0;
        psum = 0;
        scanf("%d%d",&a.x,&a.y);
        scanf("%d%d",&b.x,&b.y);
        DFS(a.x,a.y,0);
        if(flag == 0)
        {
            printf("No Solution!\n");
        }
        else
        {
            printf("%d\n",ans);
            printf("%d\n",psum);
        }
    }
    return 0;
}
时间: 2024-07-28 22:26:57

SDUT 1157 小鼠迷宫问题(水题,DFS + 回溯)的相关文章

华为题 搜索水题 DFS

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <string> 6 #include <iterator> 7 #include <algorithm> 8 #include <cstdlib> 9 #include <deque> 10 #include &l

SDUT 1157-小鼠迷宫问题(BFS&amp;DFS)

小鼠迷宫问题 Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间.小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路.请帮助小鼠a找出所有通向小鼠b的最短道路. 请编程对于给定的小鼠的迷宫,计算小鼠a通向小

SDUT 2829-家快来A水题(邻接矩阵)

家快来A水题 Time Limit: 4000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给出一个无向无权图,有n(1<= n <= 1000)个点,m(1<= m <= 1000000)条边.点的编号从1到n.m条边中可能会有重复的边,问去掉重复的边之后还剩下多少条边. 输入 多组输入.每组输入的第一行包括两个整数n,m.接下来的m行,每行包含两个整数u,v,表示两点之间有一条边. 输出 输出一个整数代表答案. 示例输入 2 3 1 2

[水题+dfs] zoj 3861 Valid Pattern Lock

题意: 给n个不同的整数(3<=n<=9),问你能绘制出多少种解锁的方案. 输出方案数,以及按字典序输出每种方案. 思路: 一个很水的dfs全排列,加上特判就好了. 特判就是1->9的话就必定经过5等. 这里要注意的是. 中间所经过的数字是必须存在的. 比如要想1->9就必须有5. 5要么被用过,要么就经过5 例子就是 1 3 5 9这四个数. 实际的方案是只有2种 3 5 1 9 和 3 5 9 1 然后就是输入完排下序,保证字典序. 最后就是弱太弱了,写了2个dfs一个算个数,

【COGS &amp; USACO Training】710. 命名那个数字(hash+水题+dfs)

http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include

SDUT 3189 Reverse Rot(水题)

Reverse Rot Time Limit: 1000MS Memory limit: 65536K 题目描述 A very simplistic scheme, which was used at one time to encode information, is to rotate the characters within an alphabet and rewrite them. ROT13 is the variant in which the characters A-Z are

FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)

解题报告 http://blog.csdn.net/juncoder/article/details/38146041 题目传送门 题意 求最短路和最短路的路数. 思路: BFS+DFS,先求出最短路.在DFS搜等于最短路的条数. 不加优化SDUTOJ过了,数据就是水. 确定了最短路的长度,加上奇偶剪枝FOJ也过了. #include <queue> #include <cmath> #include <cstdio> #include <cstring>

sdut 2841 Bit Problem (水题)

题目 贴这个题是因为看题解有更简单的方法, 我做的时候是直接算的, 也很简单. 贴一下题解吧: 如果一个整数不等于 0,那么该整数的二进制表示中至少有一位是 1. 这个题结果可以直接输出 x - (x&(x-1)); 因为x-1 之后二进制下,就是最右边的1变成了0, 最右边的1的 右边所有的0变成了1, 不影响最左边. 我的代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4

sdut 2413:n a^o7 !(第三届山东省省赛原题,水题,字符串处理)

n a^o7 ! Time Limit: 1000MS Memory limit: 65536K 题目描述 All brave and intelligent fighters, next you will step into a distinctive battleground which is full of sweet and happiness. If you want to win the battle, you must do warm-up according to my inst