FOJ 1205

Problem 1205 小鼠迷宫问题

Accept: 522    Submit: 1679 Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

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

小鼠的迷宫

编程任务

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

Input

本题有多组输入数据,你必须处理到EOF为止。 每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。(1≤p,r≤n; 1≤q,s≤m)

结果输出

 Output

对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。每组输出之间没有空行。 如果小鼠a无法通向小鼠b则输出“No Solution!”。

Sample Input

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

Sample Output

11 96

Source

FJOI2005
 
利用bfs可以计算出最短路径的距离len(即移动次数),然后用dfs计算出等于len(移动次数)时有多少种不同的最短路径。
  1 #include<stdio.h>
  2 #include<string.h>
  3 int sx[4]={0,1,0,-1};
  4 int sy[4]={1,0,-1,0};
  5 int map[100][100];
  6 int mark[100][100];
  7 int n,m;
  8 int x1,y1,x2,y2;
  9 int min_step,sum_min;
 10 int que[10000][2];
 11 int que_step[10000];
 12 void bfs(int h,int l)
 13 {
 14     
 15     int front,rear;
 16     front=rear=0;
 17     que[rear][0]=h;
 18     que[rear][1]=l;
 19     rear++;
 20     map[h][l]=1;
 21     que_step[front]=0;
 22     int xx,yy,i;
 23     
 24     while(front<rear)
 25     {
 26         for(i=0;i<4;i++)
 27         {
 28             xx=que[front][0]+sx[i];
 29             yy=que[front][1]+sy[i];
 30             
 31             if(xx==x2&&yy==y2)
 32             {
 33                 min_step=que_step[front]+1;
 34                 return;
 35             }
 36             if(map[xx][yy]==0&&xx<=n&&xx>=1&&yy>=1&&yy<=m)
 37             {
 38                 //printf("(%d %d) step=%d
",xx,yy,que_step[front]+1);
 39                 que[rear][0]=xx;
 40                 que[rear][1]=yy;
 41                 que_step[rear]=que_step[front]+1;
 42                 rear++;
 43                 map[xx][yy]=1;
 44                 
 45             }
 46         }
 47         front++;
 48     }
 49 }
 50 int t;
 51 void dfs(int x,int y,int c_step)
 52 {
 53     //printf("%d
",c_step);
 54     if(x==x2&&y==y2&&c_step==min_step)
 55     {
 56         
 57         sum_min++; return ;
 58     }
 59     if((x>x2?x-x2:x2-x)+(y>y2?y-y2:y2-y)+c_step>min_step) return ;
 60     int i;
 61     for(i=0;i<4;i++)
 62     {
 63         int xx,yy;
 64         xx=x+sx[i];
 65         yy=y+sy[i];
 66         if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&mark[xx][yy]==0)
 67         {
 68             mark[xx][yy]=1;
 69             dfs(xx,yy,c_step+1);
 70             mark[xx][yy]=0;
 71         }
 72     }
 73     
 74 }
 75 int main()
 76 {
 77     int k,i,j;
 78     while(scanf("%d %d %d",&n,&m,&k)!=EOF)
 79     {
 80         min_step=-1;sum_min=0;
 81         for(i=1;i<=n;i++)
 82         {
 83             memset(map[i],0,sizeof(map[i]));
 84             memset(mark[i],0,sizeof(mark[i]));
 85         }
 86         for(i=1;i<=k;i++)
 87         {
 88             int a,b;
 89             scanf("%d %d",&a,&b);
 90             map[a][b]=1;
 91             mark[a][b]=1;
 92         }
 93         scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
 94         t=1;
 95         bfs(x1,y1);
 96         
 97         if(min_step==-1)
 98             printf("No Solution!
");
 99         else
100         {
101             dfs(x1,y1,0);
102             printf("%d
%d
",min_step,sum_min);
103         }
104     }
105     return 0;
106 }
107 
108 /*
109 
110 3 3 1
111 2 2
112 1 1
113 3 3
114 
115 */
View Code
 
原文地址:https://www.cnblogs.com/zeze/p/foj1205.html