列表

详情


NC16735. 网格图

描述

有一个n*m的网格图。一开始小A站在(1,1)上,在每个单位时间内,他可以往上下左右四个方向走一格或者不走(从(x,y)可走到(x-1,y),(x+1,y),(x,y-1),(x,y+1),(x,y))。但是由于受到小B( 小B站在(x1,y1)上 )的影响,小A在与小B的切比雪夫距离小于等于D的时候,如果上一个单位时间移动了,那么就只能维持上一次的移动方向,或者不走。问小A从(1,1),恰好在t个单位时间后走到(x2,y2)的方案数?
移动过程中,小A的位置(x,y)必须始终满足1 <= x <= n,1 <= y <= m 
切比雪夫距离:各个维度上距离的最大值。

输入描述

第一行读入八个整数 n, m, t, x1, y1, D, x2, y2, (1 <= n,m,D <= 200,1 <= t <= 500,1 <= x1,x2 <= n,1 <= y1,y2 <= m)

输出描述

输出一个整数表示答案模 109+7

示例1

输入:

3 3 5 2 3 1 2 1

输出:

38

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 501ms, 内存消耗: 2076K, 提交时间: 2020-08-09 16:11:25

#include<bits/stdc++.h>
#pragma GCC optimize(3,"Ofast","inline")
#define Fox ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int mod=1e9+7;
int n,m,t,a,b,c,d,dist,r;
int dp[2][205][205][5];
int dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
int calc(int x,int y){
	return (max(abs(a-x),abs(b-y))<=dist);
}
int main(){
	Fox; 
	cin>>n>>m>>t>>a>>b>>dist>>c>>d;
	dp[0][1][1][0]=1;
	for(int T=1;T<=t;T++){
		r^=1;memset(dp[r],0,sizeof(dp[r]));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++){
				int v=calc(i,j);
				int rec=dp[!r][i][j][0];
				if(v){
					for(int k=1;k<5;k++){
						dp[r][i][j][0]=(dp[r][i][j][0]+dp[!r][i][j][k])%mod;
						dp[r][i+dx[k]][j+dy[k]][k]=(dp[r][i+dx[k]][j+dy[k]][k]+dp[!r][i][j][k])%mod;
					}
				}
				else for(int k=1;k<5;k++)rec=(rec+dp[!r][i][j][k])%mod;
				for(int k=0;k<5;k++)dp[r][i+dx[k]][j+dy[k]][k]=(dp[r][i+dx[k]][j+dy[k]][k]+rec)%mod;
			}
	}
	int ans=0;
	for(int i=0;i<5;i++)ans=(ans+dp[r][c][d][i])%mod;
	cout<<ans;	
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 726ms, 内存消耗: 2152K, 提交时间: 2020-04-03 20:43:35

#include<bits/stdc++.h>
using namespace std;
typedef long long s64;
#define rep(i,l,r) for(int i=l;i<=r;++i)
const int N=200+5,D=1e9+7;
const int fx[5]={-1,1,0,0,0};
const int fy[5]={0,0,-1,1,0};
s64 mi(s64 x,int y=D-2)
{
	s64 ans=1;
	while(y)
	{
		if(y&1) ans=ans*x%D;
		x=x*x%D;
		y>>=1;
	}
	return ans;
}
int dp[2][N][N][5];
int main()
{
	int n,m,t,x1,y1,d,x2,y2;
	cin>>n>>m>>t>>x1>>y1>>d>>x2>>y2;
	dp[0][1][1][4]=1;
	rep(i,1,t)
	{
		bool b=i%2;
		rep(x,1,n)
		rep(y,1,m)
		rep(t,0,4) dp[b][x][y][t]=0;
		rep(x,1,n)
		rep(y,1,m)
		rep(t,0,4)
		if(dp[b^1][x][y][t])
		rep(t2,0,4)
		if(!(max(abs(x-x1),abs(y-y1))<=d&&t2!=4&&t!=4&&t!=t2))
		(dp[b][x+fx[t2]][y+fy[t2]][t2]+=dp[b^1][x][y][t])%=D;
	}
	int ans=0;
	rep(i,0,4) (ans+=dp[t%2][x2][y2][i])%=D;
	cout<<ans;
}

上一题