我一直在这个问题上得到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;
}