題解 CF803A Maximal Binary Matrix
阿新 • • 發佈:2021-01-03
前言
模擬賽原題。。
好好一道送分被我硬打成爆蛋。。
\(\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; }