和WYZ大佬一样20pts,到主题库一测#3——#5全部偏大。

代码如下,求助:

#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,x[41],y[41],ans,t,k;
int dx[9] = {0,-2,-2,-1,1,2,2,1,-1};
int dy[9] = {0,-1,1,2,2,1,-1,-2,-2};
bool p[11][11];
inline ll read(){
	ll x = 0, m = 1;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-') m = -1;
		ch = getchar();
	}
	while(isdigit(ch)){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * m;
}
inline void write(ll x){
	if(x < 0){
		putchar('-');
		write(-x);
		return;
	}
	if(x >= 10) write(x / 10);
	putchar(x % 10 + '0');
}
inline bool check(int x, int y){
	return x > 0 && x < n && y > 0 && y < n;
}
inline void dfs(int deep,int last){
	if(deep > k){
		++ ans;
		ans = ans == 9901 ? 0 : ans;
		return;
	}
	for(int i = last; i <= t; ++ i){
	   if(p[x[i]][y[i]]) continue;
	   p[x[i]][y[i]] = true;
	   for(int j = 1; j <= 8; ++ j){
		  if(check(x[i] + dx[j],y[i] + dy[j])){
		  	p[x[i] + dx[j]][y[i] + dy[j]] = true;
		  }
	   }
	   dfs(deep + 1, i + 1);
	   p[x[i]][y[i]] = false;
	   for(int j = 1; j <= 8; ++ j){
		  if(check(x[i] + dx[j],y[i] + dy[j])){
		  	p[x[i] + dx[j]][y[i] + dy[j]] = false;
		  }
	   }
	}
}
signed main(){
	n = read(), t = read(), k = read();
	for(int i = 1; i <= t; ++ i){
		x[i] = read(), y[i] = read();
	}
	dfs(1,1);
	write(ans);
	return 0;
}

1 条评论

  • 1

信息

ID
286
时间
1000ms
内存
256MiB
难度
9
标签
递交数
183
已通过
3
上传者