蓝桥杯 飞行员兄弟(枚举 二进制)

2021-03-27 19:43:56 浏览数 (1)

解题思路:这道题目解题思路大致是,首先我们可以构造一个16位的二进制数,然后呢,二进制数的每一位代表4*4矩阵中的一位,例如1代表(1,1),2代表(1,2),3代表(1,3),4代表(1,4),5代表(2,1)。既然这样的话,那么我们只需要枚举这个16位的二进制数,就可以确定我们的方案,因为题目只需要最优解方案,所以时间复杂度大约是O(16 * 2^16)

代码语言:javascript复制
#include<bits/stdc  .h>
using namespace std;
const int N=5;
char a[N][N],b[N][N];
typedef pair<int,int> pii;
vector<pii>ans;
int main(){
    for(int i=0;i<4;i  ){
        cin>>a[i];
    }
    for(int i=0;i<(1<<16);i  ){
        vector<pii>v;
        memcpy(b,a,sizeof a);
        for(int j=0;j<16;j  ){
            
            int wei=(i>>j)&1;
            
            int row=j/4,col=j%4;
            if(wei){
                //if(val==1)cout<<"row"<<" "<<row<<" "<<col<<endl;
                //if(val==1)cout<<wei<<endl;
                v.push_back({row 1,col 1});
                for(int i=0;i<4;i  ){
                    if(b[row][i]=='-')b[row][i]=' ';
                    else b[row][i]='-';
                    if(b[i][col]=='-')b[i][col]=' ';
                    else b[i][col]='-';
                }
                if(b[row][col]=='-')b[row][col]=' ';
                else b[row][col]='-';
            }
        }
        int sum=0;
        for(int i=0;i<4;i  ){
            for(int j=0;j<4;j  ){
                if(b[i][j]=='-')sum  ;
            }
        }
        //cout<<sum<<endl;
        if(sum==16){
            if(ans.size()==0||ans.size()>v.size()){
                ans=v;
            }
        }
    }
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i  ){
        cout<<ans[i].first<<" "<<ans[i].second<<endl;
    }
}

0 人点赞