繁忙额图书馆-621-码酷(c++)

来源:互联网 发布:java maven 项目 编辑:程序博客网 时间:2024/06/05 21:49

题目:(来自码酷)

 试题编号:0621收 藏 繁忙的图书馆难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述
 某中学的Library,设计的很复杂,经常因为摆放失误,导致某个地点无法正常走到。这让馆长很是头疼,所以特地请来了,学习信息学的你,请你根据地图,检测是否能从指定起点到达指定目标地点
输入
输入的第一行有两个整数m和n,分别代表图书馆的纵向长度和横向长度。下面的m行,每行有n个数值,数值为0时(0 < m , n < 40),代表此处可行走;数值为1时,代表此处不可行走。在第m + 2行里有两个整数y0和x0,分别表示初始位置的纵坐标和横坐标;第m + 3行里有两个整数y1和x1,分别表示目标位置的纵坐标和横坐标
输出
如果可以从起点运动到终点,则输出“OK!”;否则输出“NO!”(叹号为半角字符)
输入示例
5 6
1 0 1 0 1 1
0 0 1 0 0 1
1 1 0 1 0 1
0 0 0 1 0 1
0 0 0 0 0 1
1 2
5 2
输出示例
NO!




这个思路是:

先把周围的部分变成3,然后递归,

如果这个点以前走过或者到边框或者是墙

就返回

否则

这个点变为2,变成可以走

然后试一下周围的能不能走。

难度:普及组

知识点:递归

代码如下:











#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
//ifstream cin(".in");
//ofstream cout(".out");
int a[99][99];//数组不要定大,这样就行了!
void f(int y,int x)
{
   if(a[y][x]!=0)return ;//如果这个不是可以走(如果这个点以前走过或者到边框或者是墙),就返回


     a[y][x]=2;//标记走过
     
     f(y,x+1);
     f(y,x-1);
     f(y+1,x);
     f(y-1,x);//四周
}
int main()
{
    int i,j,n,m;
    cin>>n>>m;
    for(i=0;i<=n+1;i++)
      for(j=0;j<=m+1;j++)
        a[i][j]=3;//边框
    for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
        cin>>a[i][j];//输入
    int q,w,e,r;
    cin>>q>>w>>e>>r;
    f(q,w);
    if(a[e][r]==2)
    cout<<"OK!"<<endl;//如果这个走过,就输出ok,要不然,就输出no
    else
    cout<<"NO!"<<endl;
    //system ("pause");记住!
    return 0;
}








//大家不要抄我的代码去提交,那样没有意思,还是骗自己!

//希望大家喜欢我的程序! =

原创粉丝点击