在c ++

时间:2016-06-26 05:18:08

标签: c++

我一直在这个问题上得到TLE。我曾尝试使用scanf printf而不是cin cout但它没有用。然后,我尝试了另一个有相同问题的问题 描述,唯一不同的是输入N,这意味着测试用例从1000变为10 ^ 6.但是,我得到了所有的AC。我只是想弄清楚原因。

以下是问题

描述

编写一个模拟迷宫中鼠标的程序。程序必须计算鼠标从起点到最终点所采取的步骤。

迷宫类型如下图所示:

S$###
$$#$$
$$$##
##$$F

它由S(起点),#(墙),$(道路)和F(终点)组成。

在上述情况下,从S到F需要7个步骤,如下图所示,

S$###
$$#$$
$$$##
##$$F

鼠标可以向上,向下,向左,向右四个方向移动。可能有多种方法可以达到最终点,程序只需打印最少的步骤。

如果从S到F没办法,则打印-1。

输入

第一行具有整数N(1 <= N <= 1000),这意味着测试用例的数量。

对于每种情况,第一行有两个整数。第一和第二整数R和C(3 <= R,C <= 500)分别表示迷宫的行数和列数。因此,迷宫中元素的总数是R x C.

以下R行(每行包含C字符)指定迷宫的元素。

输出

为每种情况打印最少的步骤,每行末尾都有一个换行符。

Sample Input
3
4 5
S$###
$$#$$
$$$##
##$$F
4 5
S$$##
#$$$#
#$#$#
#$$$F
4 5
##S$#
$##$$
$$$##
#F###

Sample Output
7
7
-1

以下是我的代码

#include <iostream>
#include <climits>

using namespace std;
int least_step;
void maze(char a[501][501],int,int,int,int,int);

#define wall '#'

int main(){

    int ncase;
    cin>>ncase;
    char a[501][501];
    while(ncase--){
          int num1,num2;
          cin>>num1>>num2;
          least_step = INT_MAX;
          int si,sj;
          for(int i=0;i<num1;i++){
              for(int j=0;j<num2;j++){
                  cin >> a[i][j];
                  if(a[i][j]=='S'){
                     si = i;
                     sj = j;
                  }
              }
          }

          maze(a,si,sj,num1,num2,0);

          if(least_step==INT_MAX){
             least_step = -1;
          }

          cout<<least_step<<endl;
    }

   return 0;
}

void maze(char a[501][501],int i,int j,int num1,int num2,int step){

    if(a[i][j] == 'F'){
       if(step<least_step){
         least_step = step;
       }
       return;
    }

    a[i][j] = wall;

    if(i+1<num1&&a[i+1][j] != wall){
       maze(a,i+1,j,num1,num2,step+1);
    }
    if(j+1<num2&&a[i][j+1] != wall){
       maze(a,i,j+1,num1,num2,step+1);
    }
    if(i-1>=0&&a[i-1][j] != wall){
       maze(a,i-1,j,num1,num2,step+1);
    }
    if(j-1>=0&&a[i][j-1] != wall){
       maze(a,i,j-1,num1,num2,step+1);
    }

    a[i][j] = '$';

   return;
}

0 个答案:

没有答案