一道题目,我TLE得很惨。。。
题目大意:
题目意思:小名有一个n×m大小的棋盘,用0或1表示,其中1表示障碍物。小名从左上角出发,每次只能向下或者向右走一格,但是他不能走到障碍物上,问从左上角走到右下角有多少种不同的走法?
基础的代码已经写出来了,就是回溯算法,但是数据范围:
1≤n,m≤100我下面的代码超时。。。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans=0;
int dx[]={-100,1,0};
int dy[]={-100,0,1};
int a[105][105];
void search(int x,int y)
{
if(x==n && y==m)
{
ans++;
return;
}//乡下或者向右
for(int i=1;i<=2;i++)
{
x+=dx[i];
y+=dy[i];
if(x>=1 && y>=1 && x<=n && y<=m && a[x][y]!=1)
{
search(x,y);
}
x-=dx[i];
y-=dy[i];
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
if(a[1][1]==1)
{
cout<<"0"<<endl;
return 0;
}
search(1,1);
cout<<ans<<endl;
return 0;
}
求各位大神帮忙看一下,怎样优化不会超时?