解题思路:这道题目解题思路大致是,首先我们可以构造一个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;
}
}