zoukankan      html  css  js  c++  java
  • 洛谷 P1238 走迷宫

    因为小处疏漏,多花了半小时的水题

    题目描述

    有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-l表示无路)。

    输入输出格式

    输入格式:

    第一行是两个数m,n(1<m,n<15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。

    输出格式:

    所有可行的路径,描述一个点时用(x,y)的形式,除开始点外,其他的都要用“一>”表示方向。

    如果没有一条可行的路则输出-1。

    输入输出样例

    输入样例#1:
    5 6
    1 0 0 1 0 1
    1 1 1 1 1 1
    0 0 1 1 1 0
    1 1 1 1 1 0
    1 1 1 0 1 1
    1 1
    5 6
    输出样例#1:
    (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)




    题目本身没什么难度
     1 /*by SilverN*/
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 using namespace std;
     8 const int mxn=100;
     9 int mp[mxn][mxn];
    10 int vis[mxn][mxn];
    11 int n,m;
    12 int sx,sy,ex,ey;//始终点坐标 
    13 int wx[mxn*10],wy[mxn*10];//路径 
    14 int mx[5]={0,-1,0,0,1},
    15     my[5]={0,0,-1,1,0};
    16 bool flag=0;
    17 void Print(int len){
    18     for(int i=1;i<len;i++)printf("(%d,%d)->",wx[i],wy[i]);
    19     flag=1;
    20 //    printf("(%d,%d)
    ",wx[len],wy[len]);
    21     return;
    22 }
    23 void dfs(int x,int y,int L){
    24     if(x==ex && y==ey){
    25         Print(L);
    26         printf("(%d,%d)
    ",x,y);
    27         return;
    28     }
    29     //顺序为左下右上 
    30     wx[L]=x;wy[L]=y;
    31     vis[x][y]=1;
    32     for(int i=0;i<=4;i++){
    33         int nx=x+mx[i];
    34         int ny=y+my[i];
    35 //        printf("test: %d %d %d
    ",nx,ny,L);
    36         if(nx>0 && nx<=m && ny>0 && ny<=n && mp[nx][ny] && !vis[nx][ny]){    
    37             dfs(nx,ny,L+1);    
    38         }
    39     }
    40     vis[x][y]=0;
    41     return;
    42 }
    43 int main(){
    44     scanf("%d%d",&m,&n);
    45     int i,j;
    46     for(i=1;i<=m;i++)
    47       for(j=1;j<=n;j++){
    48           scanf("%d",&mp[i][j]);
    49       }
    50     scanf("%d%d",&sx,&sy);
    51     scanf("%d%d",&ex,&ey);
    52     wx[1]=sx;wy[1]=sy;
    53     vis[sx][sy]=1;
    54     if(sx==ex && sy==ey){ printf("-1
    ") ;return 0;}
    55     dfs(sx,sy,1);
    56     if(!flag)printf("-1
    ");
    57     return 0;
    58 }
  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5557932.html
Copyright © 2011-2022 走看看