考场代码求条 洛谷60分
查看原帖
考场代码求条 洛谷60分
381471
欧阳逸owen楼主2024/10/26 21:31
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e3+10;
char c[N][N];
ll ans,f[N][N]; 
bool vis[N][N];
ll n,m,k,num;
void dfs(ll x,ll y,ll d,ll temp){
//	cout << x << " " << y << " " << d << " " << temp << " " << num << endl;
	if(vis[x][y]){
		num=f[x][y]+1;
		return ;
	} 
	if(!vis[x][y]) vis[x][y]=1;
	if(temp<=0){
		return ;
	} 
	f[x][y]=num++;
	if(d==0){
		if(y+1>m||c[x][y+1]=='x'){
			vis[x][y]=0;
			dfs(x,y,1,temp-1);
		}
		else dfs(x,y+1,d,temp-1);
	}
	else if(d==1){
		if(x+1>n||c[x+1][y]=='x'){
			vis[x][y]=0;
			dfs(x,y,2,temp-1);
		}
		else{
			dfs(x+1,y,d,temp-1);
		}
	}
	else if(d==2){
		if(y-1<1||c[x][y-1]=='x'){
			vis[x][y]=0;
			dfs(x,y,3,temp-1);
		}
		else dfs(x,y-1,d,temp-1);
	}
	else{
		if(x-1<1||c[x-1][y]=='x'){
			vis[x][y]=0;
			dfs(x,y,0,temp-1);
		}	
		else dfs(x-1,y,d,temp-1);
	}
	return ;
}
ll x,y,d;
void solve(){
	ans=0;
	num=0;
	cin >> n >> m >> k;
	cin >> x >> y >> d;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin >> c[i][j];
			f[i][j]=0;
			vis[i][j]=0;
		}
	}
	dfs(x,y,d,k);
	vis[x][y]=0;
	if(d==3||d==0){
		num+=1;
	} 
//	cout << num << endl;
	dfs(x,y,(d+2)%4,k-2*num);
	num=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(vis[i][j]) ans++;
		} 
	}
	cout << ans << endl;
	return ;
}
ll T;
int main(){
//	freopen("explore2.in","r",stdin);
//	freopen("explore.out","w",stdout);
    cin >> T;
    while(T--) solve(); 
    return 0;
}
2024/10/26 21:31
加载中...