比赛 20241129 评测结果 WTTTTMEEEE
题目名称 棋局 最终得分 0
用户昵称 黄天宇 运行时间 9.319 s
代码语言 C++ 内存使用 56.25 MiB
提交时间 2024-11-29 11:59:12
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int MAXN=2e3+5;
int a[MAXN];
int k[MAXN];
bool bo;
int mapp[MAXN][MAXN];
bool vis[MAXN][MAXN];
int cnt;
int minx[MAXN];
void dfs(int nowx,int nowy,int ans){
	//vis[nowx][nowy]=1;
	if(ans==n*m){
		for(int i=1;i<=n;i++){
		int c=0;
			for(int j=1;j<=m;j++){
				if(mapp[i][j]==1){
					c++;
				}
			}
			if(c<a[i]){
				c=0;
				return;
			}
		} 
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(mapp[i][j]==1){
					k[j]++;
					cout<<k[j]<<endl;
				}
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(k[j]>=i){
					cnt++;
				}
			}
			minx[i]=min(minx[i],cnt);
			cnt=0;
			memset(k,0,sizeof(k));
		}
		return;
	}
	for(int k=0;k<=1;k++){
		if(nowx+1>=1&&nowx+1<=n&&nowy>=1&&nowy<=m&&!vis[nowx+1][nowy]){
			vis[nowx+1][nowy]=1;
			mapp[nowx+1][nowy]=k;
			dfs(nowx+1,nowy,ans+1);
			mapp[nowx+1][nowy]=-1;
			vis[nowx+1][nowy]=0;
		}
		if(nowx+1>=1&&nowx+1<=n&&nowy>=1&&nowy<=m&&!vis[nowx-1][nowy]){
			vis[nowx-1][nowy]=1;
			mapp[nowx-1][nowy]=k;
			dfs(nowx-1,nowy,ans+1);
			mapp[nowx-1][nowy]=-1;
			vis[nowx-1][nowy]=0;
		}
		if(nowx+1>=1&&nowx+1<=n&&nowy>=1&&nowy<=m&&!vis[nowx][nowy+1]){
			vis[nowx][nowy+1]=1;
			mapp[nowx][nowy+1]=k;
			dfs(nowx,nowy+1,ans+1);
			mapp[nowx][nowy+1]=-1;
			vis[nowx][nowy+1]=0;
		}
		if(nowx+1>=1&&nowx+1<=n&&nowy>=1&&nowy<=m&&!vis[nowx][nowy-1]){
			vis[nowx][nowy-1]=1;
			mapp[nowx][nowy-1]=k;
			dfs(nowx,nowy-1,ans+1);
			mapp[nowx][nowy-1]=-1;
			vis[nowx][nowy-1]=0;
		}
	}
	return;
}
int main(){
	freopen("qiju.in","r",stdin);
	freopen("qiju.out","w",stdout);
	cin>>n>>m;
	memset(mapp,-1,sizeof(mapp));
	memset(minx,0x3f,sizeof(minx));
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]!=m-1) bo=1;
	}
	if(!bo){
		for(int i=1;i<=n;i++){
			if(n/2==0){
				if(i==1) cout<<1<<" ";
				else cout<<0<<" ";
			}else
			if(i<=(n+1)/2){
				cout<<1<<" ";
			}else
			cout<<0<<" ";
		}
		return 0;
	}else{
		dfs(1,1,0);
	for(int i=1;i<=n;i++){
		cout<<minx[i]<<" ";
	}
	}
	return 0;
}