外站提求调(搜索剪枝)
  • 板块题目总版
  • 楼主AC721
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/1/22 18:53
  • 上次更新2025/2/3 14:09:56
查看原帖
外站提求调(搜索剪枝)
1277231
AC721楼主2025/1/22 18:53

量子奶牛

最新提交:

Time Limit Exceeded 90 分

历史最高:

Time Limit Exceeded 90 分

时间限制: 1000ms

空间限制: 524288kB

题目描述

约翰 T 秒前看到奶牛在 (x1,y1) 处,而现在看到奶牛在 (x2, y2) 处。毫无疑问,奶牛在这 T 秒内发生了量子隧穿效应。已知奶牛每秒可以移动一步到与当前格子四连通的格子处(除非目标格子处有障碍),现在约翰想知道奶牛有几种可能的隧穿路径。

(其实就是求从(x1,y1)走到(x2,y2)恰好过了 T 秒的路径数量)

输入格式

第一行包含 3个用空格隔开的整数 n,m,T。

接下来 n 行每行一个长度为 m 的字符串。'.' 是空地,'*'是障碍

最后一行 4 个整数 x1, y1, x2, y2。

输出格式

输出一行一个整数表示答案。

样例

Input 1

4 5 6
...*.
...*.
.....
.....
1 3 1 5

Output 1

1

样例解释

样例输入中,奶牛从(1,3)到(1,5)需要6秒,只有一种可能的路径。

数据范围

2≤N,M≤100,0<T≤15。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ex,ey,k,dx[4]={1,-1,0,0},dy[4]={0,0,-1,1},ans;
char a[105][105];
void dfs(int x,int y, int t){
	if(x==ex&&y==ey&&t==k){
		ans++;
		return;
	}
	if(t>k){
		return;
	}
	for(int i=0;i<4;i++){
		int xx=x+dx[i],yy=y+dy[i];
		if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[xx][yy]!='*'){
			dfs(xx,yy,t+1);
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char kkksc03;
			cin>>kkksc03;
			a[i][j]=kkksc03;
		}
	}
	cin>>sx>>sy>>ex>>ey;
	if(abs(ex-sx)+abs(ey-sy)>k){
		cout<<0;
		return 0;
	}
	dfs(sx,sy,0);
	cout<<ans;
	return 0;
}

TLE 90
哪里能再次剪枝(本题为搜索的剪枝)

2025/1/22 18:53
加载中...