#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int m,n;
int map[20][350];
int vis[350];
bool pan1()
{
for(int i=0;i<n;i++)
if(vis[i]==0)return
false;
return true;
}//判断是否某一列完全没有1
bool pan2()
{
for(int i=0;i<n;i++)
if(vis[i]>1)return
false;
return true;
}//判断新加入的行是否会与前面的行冲突
bool dfs(int t)
{
if(pan1())return
true;//判断已找到的行是否符合条件
if(t>=m)
{
if(pan1())return
true;
else return
false;
}//如果找到了最后一行,判断是否符合条件
for(int i=0;i<n;i++)
{
if(map[t][i]==1)vis[i]++;
}//对于当前这一行
if(pan2())
{
if(dfs(t+1))return
true;
}//判断加进这一行后是否与前面发生矛盾
for(int i=0;i<n;i++)
{
if(map[t][i]==1)vis[i]--;
}//如果矛盾,则回溯
if(dfs(t+1))return
true;
return false;
}
int main()
{
while(cin>>m>>n)
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
memset(vis,0,sizeof(vis));
if(dfs(0))cout<<"Yes,
I found it\n";
else cout<<"It is impossible\n";
}
return 0;
}
注意输入输出,不然会坑爹的超时
本文探讨了一种使用深度搜索算法解决特定矩阵排列问题的方法,通过判断矩阵每一行和每一列是否包含特定元素来实现解决方案。该算法通过递归地尝试不同行的排列,确保最终形成的矩阵符合特定条件。
1431

被折叠的 条评论
为什么被折叠?



