1. 程式人生 > 實用技巧 >題解 CF803A Maximal Binary Matrix

題解 CF803A Maximal Binary Matrix

Luogu

codeforces

前言

模擬賽原題。。

好好一道送分被我硬打成爆蛋。。

\(\sf{Solution}\)

看了一波資料範圍,感覺能 dfs 騙分。

騙成正解了。

大概就是將這個 \(n\times n\) 的矩陣全掃一遍,可以選擇填 \(1\) 或不填。回溯一下就行啦。

  • 位置問題

假設現在的座標為 \((x,y)\)

\(x>n\) ,則結束 dfs ,比較一下矩陣字典序,較為簡單不題。

\(y>n\) ,則 \(x→x+1,y=1\) ,即跳到下一行第一位。

  • 對稱處理 (定義 \(a_{x,y}\) 為當前搜到的地方)

    • 在對角線上

    只填這個地方。

    • 其他

    \(a_{x,y}\)\(a_{y,x}\)

\(1\) 的話就要相應處理 \(k\)

  • 特判

\(k=0\) ,輸出全 \(0\) 矩陣。

\(\sf{Code}\)

寫得有點麻煩。。

#include<iostream>
#include<cstdio>
using namespace std;
int n,k;
bool flag,m[105][105],q[105][105];
inline bool p()
{
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(m[i][j]<q[i][j])
				return flag=true;
	return false;
}
inline void dfs(int x,int y,int d)
{
	if(y>n)
		++x,y=1;
	if(d==0)
	{
		if(p())
			for(int i=1;i<=n;++i)
				for(int j=1;j<=n;++j)
					m[i][j]=q[i][j];
		return ;
	}
	if(x>n)
		return ;
	if(x==y&&d>=1&&!q[x][y])
			q[x][y]=1,dfs(x,y+1,d-1),q[x][y]=0;
	else if(x!=y&&d>=2&&(!q[x][y]||!q[y][x])) 
	{
		if(q[x][y]==0&&q[y][x]==0)
			q[x][y]=1,q[y][x]=1,dfs(x,y+1,d-2),q[x][y]=0,q[y][x]=0;
		else if(q[x][y]==1&&q[y][x]==0)
			q[y][x]=1,dfs(x,y+1,d-1),q[y][x]=0;
		else if(q[x][y]==0&&q[y][x]==1)
			q[x][y]=1,dfs(x,y+1,d-1),q[x][y]=0;
	}
	else dfs(x,y+1,d);
	return ;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin>>n>>k;
	if(k==0)
	{
		for(int i=1;i<=n;++i,cout<<"\n")
			for(int j=1;j<=n;++j)
				cout<<"0 ";
		return 0;
	}
	if(k>n*n)
	{
		cout<<-1;
		return 0;
	}
	q[1][1]=1;
	dfs(1,2,k-1);
	if(flag)
		for(int i=1;i<=n;++i,cout<<"\n")
			for(int j=1;j<=n;++j)
				cout<<m[i][j]<<" ";
	else cout<<"-1";
	return 0;
}