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. int sy[]={,,-,};
  5. int map[][];
  6. int mark[][];
  7. int n,m;
  8. int x1,y1,x2,y2;
  9. int min_step,sum_min;
  10. int que[][];
  11. int que_step[];
  12. void bfs(int h,int l)
  13. {
  14.  
  15. int front,rear;
  16. front=rear=;
  17. que[rear][]=h;
  18. que[rear][]=l;
  19. rear++;
  20. map[h][l]=;
  21. que_step[front]=;
  22. int xx,yy,i;
  23.  
  24. while(front<rear)
  25. {
  26. for(i=;i<;i++)
  27. {
  28. xx=que[front][]+sx[i];
  29. yy=que[front][]+sy[i];
  30.  
  31. if(xx==x2&&yy==y2)
  32. {
  33. min_step=que_step[front]+;
  34. return;
  35. }
  36. if(map[xx][yy]==&&xx<=n&&xx>=&&yy>=&&yy<=m)
  37. {
  38. //printf("(%d %d) step=%d\n",xx,yy,que_step[front]+1);
  39. que[rear][]=xx;
  40. que[rear][]=yy;
  41. que_step[rear]=que_step[front]+;
  42. rear++;
  43. map[xx][yy]=;
  44.  
  45. }
  46. }
  47. front++;
  48. }
  49. }
  50. int t;
  51. void dfs(int x,int y,int c_step)
  52. {
  53. //printf("%d\n",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=;i<;i++)
  62. {
  63. int xx,yy;
  64. xx=x+sx[i];
  65. yy=y+sy[i];
  66. if(xx>=&&xx<=n&&yy>=&&yy<=m&&mark[xx][yy]==)
  67. {
  68. mark[xx][yy]=;
  69. dfs(xx,yy,c_step+);
  70. mark[xx][yy]=;
  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=-;sum_min=;
  81. for(i=;i<=n;i++)
  82. {
  83. memset(map[i],,sizeof(map[i]));
  84. memset(mark[i],,sizeof(mark[i]));
  85. }
  86. for(i=;i<=k;i++)
  87. {
  88. int a,b;
  89. scanf("%d %d",&a,&b);
  90. map[a][b]=;
  91. mark[a][b]=;
  92. }
  93. scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
  94. t=;
  95. bfs(x1,y1);
  96.  
  97. if(min_step==-)
  98. printf("No Solution!\n");
  99. else
  100. {
  101. dfs(x1,y1,);
  102. printf("%d\n%d\n",min_step,sum_min);
  103. }
  104. }
  105. return ;
  106. }
  107.  
  108. /*
  109.  
  110. 3 3 1
  111. 2 2
  112. 1 1
  113. 3 3
  114.  
  115. */
 

FOJ 1205的更多相关文章

  1. Caused by: java.sql.BatchUpdateException: Transaction error, need to rollback. errno:1205 Lock wait timeout exceeded; try restarting transaction

    更新的时候报 Caused by: java.sql.BatchUpdateException: Transaction error, need to rollback. errno:1205 Loc ...

  2. Mysql Error:1205错误诊断

    前两天遇到一个1205(ER_LOCK_WAIT_TIMEOUT)的错误,弄了半天终于找到原因,掌握原理+细心才能找到罪归祸首.下面我给大家分享下这个问题的分析处理过程,希望对大家有所帮助.接到sla ...

  3. 排序+逆向思维 ACdream 1205 Disappeared Block

    题目传送门 /* 从大到小排序,逆向思维,从最后开始考虑,无后向性 每找到一个没被淹没的,对它左右的楼层查询是否它是孤立的,若是++,若不是-- 复杂度 O(n + m),还以为 O(n^2)吓得写了 ...

  4. Problem 2020 组合(FOJ)

    Problem 2020 组合 Accept: 714    Submit: 1724Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem ...

  5. magento后台登陆被锁定 索引报错的解决:General error: 1205 Lock wait timeout

    1. magento在索引的时候用shell,有时候会报错: General error: 1205 Lock wait timeout exceeded 这个时候,是因为行锁的原因,在表中您直接用s ...

  6. wikioi 1205 单词倒排

    /*====================================================================== 1205 单词翻转 题目描述 Description ...

  7. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    测试库一条update语句报错:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction mysql> ...

  8. 九度OJ 1205 N阶楼梯上楼问题 -- 动态规划(递推求解)

    题目地址:http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括 ...

  9. hdu 1205

    #include <stdio.h> int a[1005000]; int main() { int t; scanf("%d",&t); while(t-- ...

随机推荐

  1. AngularJS - 快速入门

    刚开始接触时总是去wiki或各种百科以了解一番. 它们会告诉我一些MVVM.双向数据绑定.依赖注入等等名词,觉得这些名词好上档次,然后我很可能就不打算用这个东西了. AngularJS是什么? 完全使 ...

  2. 配置个舒心的 Java 开发环境

    Redmonk发布Java框架流行度调研结果:http://www.infoq.com/cn/news/2016/09/redmonk-java-frameworks 尝试:Intellij IDEA ...

  3. [转]java基础学习总结——equals方法

    一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...

  4. 关闭浏览器后Session失效原因分析

    参考文章:http://www.tuicool.com/articles/VNbYjqm 首先需要理解一下几点: 1.Http是无状态的,即对于每一次请求都是一个全新的请求,服务器不保存上一次请求的信 ...

  5. JS模式-基本的单例模式

    //singleton var SingletonTester = (function(){ function Singleton(options){ options = options || {}; ...

  6. uva12532 线段树单点更新

    #include<stdio.h> #include<string.h> #include<queue> using namespace std; #define ...

  7. BZOJ-1003 物流运输trans SPFA+DP

    傻逼错误耗我1h,没给全范围坑我1A.... 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Submit: 529 ...

  8. 【poj3714】 Raid

    http://poj.org/problem?id=3714 (题目链接) 现在才搞平面最近点对..感觉有点尴尬 题意 给出平面上两组点,每组n个,求两组点之间最短距离 Solution1 平面最近点 ...

  9. BZOJ1208 宠物收养所

    Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...

  10. linux mysql 相关操作命令

    1.linux下启动mysql的命令:mysqladmin start/ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令:mysqla ...