请问怎么处理字典序,我55分(样例都没过)
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=1e9;
char c;
bool b[18][18],anss[18][18],o[18][18];
void f(int i,int j){
b[i][j]=!b[i][j];
b[i-1][j]=!b[i-1][j];
b[i][j-1]=!b[i][j-1];
b[i+1][j]=!b[i+1][j];
b[i][j+1]=!b[i][j+1];
}
void dfs(int x,int s,bool v){
if(x>n){
for(int i=1;i<=m;i++){
if(b[n][i]==v) return;
}
if(s<ans){
ans=s;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++) anss[i][j]=o[i][j];
}
}
return;
}
int p=0;
for(int i=1;i<=m;i++){
if(b[x-1][i]==v){
f(x,i);
o[x][i]=1;
s++;
p+=1<<(i-1);
}
}
dfs(x+1,s,v);
for(int i=1;i<=n;i++){
if((p>>(i-1))&1){
f(x,i);
o[x][i]=0;
}
}
}
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++) scanf("%d",&b[i][j]);
}
for(int i=1;i<=1<<n;i++){
for(int j=1;j<=n;j++) b[0][j]=(i>>(j-1))&1;
dfs(1,0,0);
dfs(1,0,1);
}
if(ans==1e9) printf("IMPOSSIBLE");
else{
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++) printf("%d ",anss[i][j]);
printf("\n");
}
}
return 0;
}