2024年码蹄杯C题 星辰大海 题型:搜索

56 阅读1分钟

码题集OJ-星辰大海 (matiji.net)

把每一列提取出来,其实就是自身和上下左右一共五个方向 image.png

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=337077;
const int N=100;
int g[N][N];
int ROW,COL,k;
int ans;

int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,-1,1};
bool check(int row,int col)
{
	for(int i=0;i<5;i++)
	{
		int tx=row+dx[i],ty=col+dy[i];
		if(g[tx][ty])return 0;
	}
return 1;
}
void dfs(int id,int cnt)
{
	if(cnt==k)
	{
		ans++; //找到一种合法组合
		ans%=mod; 
		return;
	}
	
	for(int i=id;i<ROW*COL;i++)
	{
		//一维坐标变二维坐标 
		int row=i/ROW+1;
		int col=i%ROW+1;
		if(check(row,col))
		{
		  g[row][col]=1;
          cnt++;
		  dfs(i+1,cnt);
		  g[row][col]=0;
          cnt--;
        
		} 
	}
}
void solve()
{
	ans=0;
	cin>>ROW>>COL>>k;
	dfs(0,0);
	cout<<ans<<endl;
}
signed main()
{
	cin.tie(nullptr)->sync_with_stdio(false);
	int t=1;cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

image.png