看了答案,加上每个点只能走一次这个前提,就可以进行dfs暴力搜索了。【因为一个点走两次==这个点没走,无论中间隔了多少个点都成立】
class Solution {
public:
// 如何将一个mats经过若干步骤后翻转成全0的矩阵??
// 每次翻转,将改变四周以及当前位置
void flip(vector<vector<int>>& mat, int x, int y){
int row = mat.size();
int col = mat[0].size();
mat[x][y] = 1-mat[x][y];
if (x-1>=0&&x-1<row&&y>=0&&y<col){
mat[x-1][y] = 1-mat[x-1][y];
}
if (x+1>=0&&x+1<row&&y>=0&&y<col){
mat[x+1][y] = 1-mat[x+1][y];
}
if (x>=0&&x<row&&y-1>=0&&y-1<col){
mat[x][y-1] = 1-mat[x][y-1];
}
if (x>=0&&x<row&&y+1>=0&&y+1<col){
mat[x][y+1] = 1-mat[x][y+1];
}
return;
}
bool checkzeros(vector<vector<int>>& mat){
int row = mat.size();
int col = mat[0].size();
for (int i=0;i<row;i++){
for(int j=0;j<col;j++){
if (mat[i][j]==1){
return false;
}
}
}
return true;
}
int func(vector<vector<int>>& mat, vector<vector<int>>& visit) {
int row = mat.size();
int col = mat[0].size();
if (checkzeros(mat)){return 0;}
int result = 1e9;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
//cout<<i<<" "<<j<<endl;
if (visit[i][j]==0){
visit[i][j]=1;
flip(mat, i, j);
result = min(result, func(mat, visit)+1);
flip(mat, i, j);
visit[i][j]=0;
}
}
}
return result;
}
int minFlips(vector<vector<int>>& mat) {
int row = mat.size();
int col = mat[0].size();
vector<int> temp(col, 0);
vector<vector<int>> visit(row, temp);
int res = func(mat, visit);
if (res>=1e9){return -1;}
return res;
}
};