QWQ 求助
  • 板块题目总版
  • 楼主人间温柔
  • 当前回复27
  • 已保存回复27
  • 发布时间2020/5/29 22:47
  • 上次更新2023/11/7 01:29:24
查看原帖
QWQ 求助
178195
人间温柔楼主2020/5/29 22:47

一道题目,我TLE得很惨。。。

题目大意:

题目意思:小名有一个n×mn\times m大小的棋盘,用0011表示,其中11表示障碍物。小名从左上角出发,每次只能向下或者向右走一格,但是他不能走到障碍物上,问从左上角走到右下角有多少种不同的走法?

基础的代码已经写出来了,就是回溯算法,但是数据范围:

1n,m1001\leq n,m\leq 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;
}

求各位大神帮忙看一下,怎样优化不会超时?

2020/5/29 22:47
加载中...