• 题解 CF803A Maximal Binary Matrix


    Luogu

    codeforces

    前言

    模拟赛原题。。

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

    (sf{Solution})

    看了一波数据范围,感觉能 dfs 骗分。

    骗成正解了。

    大概就是将这个 (n imes 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<<"
    ")
    			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<<"
    ")
    			for(int j=1;j<=n;++j)
    				cout<<m[i][j]<<" ";
    	else cout<<"-1";
    	return 0;
    }
    
  • 相关阅读:
    面向消息的持久通信与面向流的通信
    通信协议
    [1]序章,基本
    深拷贝和浅拷贝
    堆/栈 内存管理相关
    C++的四种cast(显示类型转换)
    智能指针相关
    C++对象模型:单继承,多继承,虚继承
    HTTP/TCP
    [读书笔记] 为什么绝不在构造/析构函数中调用virtual函数
  • 原文地址:https://www.cnblogs.com/CM-0728/p/14225305.html
Copyright © 2020-2023  润新知