从 7s 卡到 5s 我已经尽力了,求助!!!
#include<cstdio>
#include<iostream>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
using namespace std;
const int N=13;
char a[N][N];
int n,m;
int A[N][N],B[N][N];
int ans[N][N];
int nxt[N][N];
inline void print(){
for(register int i=1;i<=n;++i) {
for(register int j=1;j<=m;++j) {
printf("%d",ans[i][j]);
} puts("");
}
}
inline void print1(){
for(register int i=0;i<=n+1;++i) cout<<a[i]<<endl;
}
inline bool check(){
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
if(a[i][j]!='0'&&a[i][j]!='_')return false;
return true;
}
inline void get_add(register int x,register int y){
if(a[x-1][y-1] != '_') --a[x-1][y-1];
if(a[x-1][y] != '_') --a[x-1][y];
if(a[x-1][y+1] != '_') --a[x-1][y+1];
if(a[x][y-1] != '_') --a[x][y-1];
if(a[x][y] != '_') --a[x][y];
if(a[x][y+1] != '_') --a[x][y+1];
if(a[x+1][y-1] != '_') --a[x+1][y-1];
if(a[x+1][y] != '_') --a[x+1][y];
if(a[x+1][y+1] != '_') --a[x+1][y+1];
}
inline void get_div(register int x,register int y){
if(a[x-1][y-1] != '_') ++a[x-1][y-1];
if(a[x-1][y] != '_') ++a[x-1][y];
if(a[x-1][y+1] != '_') ++a[x-1][y+1];
if(a[x][y-1] != '_') ++a[x][y-1];
if(a[x][y] != '_') ++a[x][y];
if(a[x][y+1] != '_') ++a[x][y+1];
if(a[x+1][y-1] != '_') ++a[x+1][y-1];
if(a[x+1][y] != '_') ++a[x+1][y];
if(a[x+1][y+1] != '_') ++a[x+1][y+1];
}
inline int check1(register int x,register int y) {
bool flag1=false;
bool flag0=false;
bool flagNO=false;
register int cnt=0;
++cnt;
if(a[x-1][y-1]!='_'){//continue;
if(a[x-1][y-1]>'0'+cnt)flagNO=true;
if(a[x-1][y-1]=='0')flag0=true;
if(a[x-1][y-1]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x-1][y]!='_'){//continue;
if(a[x-1][y]>'0'+cnt)flagNO=true;
if(a[x-1][y]=='0')flag0=true;
if(a[x-1][y]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x-1][y+1]!='_'){
if(a[x-1][y+1]>'0'+cnt)flagNO=true;
if(a[x-1][y+1]=='0')flag0=true;
if(a[x-1][y+1]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x][y-1]!='_'){//continue;
if(a[x][y-1]>'0'+cnt)flagNO=true;
if(a[x][y-1]=='0')flag0=true;
if(a[x][y-1]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x][y]!='_'){//continue;
if(a[x][y]>'0'+cnt)flagNO=true;
if(a[x][y]=='0')flag0=true;
if(a[x][y]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x][y+1]!='_'){//continue;
if(a[x][y+1]>'0'+cnt)flagNO=true;
if(a[x][y+1]=='0')flag0=true;
if(a[x][y+1]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x+1][y-1]!='_'){//continue;
if(a[x+1][y-1]>'0'+cnt)flagNO=true;
if(a[x+1][y-1]=='0')flag0=true;
if(a[x+1][y-1]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x+1][y]!='_'){//continue;
if(a[x+1][y]>'0'+cnt)flagNO=true;
if(a[x+1][y]=='0')flag0=true;
if(a[x+1][y]=='0'+cnt)flag1=true;
}
++cnt;
if(a[x+1][y+1]!='_'){//continue;
if(a[x+1][y+1]>'0'+cnt)flagNO=true;
if(a[x+1][y+1]=='0')flag0=true;
if(a[x+1][y+1]=='0'+cnt)flag1=true;
}
if(flag1&&flag0)flagNO=true;
if(flagNO)return -1;
if(flag1)return 1;
if(flag0)return 0;
return 2;
}
bool flag=false;
inline void dfs(register int x,register int y){
//printf("%d - > %d\n", x, y);
/*if(y==m+1){
x=x+1;
y=1;
}*/
if(flag)return;
register int aa=check1(x,y);
//printf("(%d,%d)check1 is %d\n",x,y,aa);
if(aa==-1)return ;
register int Nx = nxt[x][y] / 100;
register int Ny = nxt[x][y] % 100;
if(aa==0){
if(nxt[x][y] == 114514) {
ans[x][y]=0;
if(!flag){
if(check()) {
flag=true;
print();
}
}
ans[x][y]=-1;
return ;
}
ans[x][y]=0;
dfs(Nx,Ny);
ans[x][y]=-1;
return;
}
if(aa==1){
if(nxt[x][y] == 114514) {
ans[x][y]=1;
get_add(x,y);
if(!flag){
if(check()) {
flag=true;
print();
}
}
get_div(x,y);
ans[x][y]=-1;
return ;
}
ans[x][y]=1;
get_add(x,y);
dfs(Nx,Ny);
get_div(x,y);
ans[x][y]=-1;
return;
}
if(aa==2){
if(nxt[x][y] == 114514) {
ans[x][y]=0;
if(!flag){
if(check()) {
flag=true;
print();
}
}
ans[x][y]=1;
get_add(x,y);
if(!flag){
if(check()) {
flag=true;
print();
}
}
get_div(x,y);
ans[x][y]=-1;
return ;
}
ans[x][y]=0;
dfs(Nx,Ny);
ans[x][y]=1;
get_add(x,y);
dfs(Nx,Ny);
get_div(x,y);
ans[x][y]=-1;
return;
}
}
inline void work(register int x,register int y){
for(register int i=-1;i<=1;++i){
for(register int j=-1;j<=1;++j){
if(ans[x+i][y+j]==1)a[x][y]--;
}
}
}
inline void GG(register int x,register int y){
bool FF=false;
register int TT=0;
for(register int i=-1;i<=1;++i)
for(register int j=-1;j<=1;++j){
if(a[x+i][y+j]=='0')FF=false;
if(a[x+i][y+j]=='_')++TT;
}
if(FF||TT==9)ans[x][y]=0;
}
int main() {
scanf("%d %d",&n,&m);
for(register int i=1;i<=n;++i) scanf("%s",a[i]+1);
for(register int i=0;i<=n+1;++i)a[i][m+1]=a[i][0]='_';
for(register int j=0;j<=m+1;++j)a[n+1][j]=a[0][j]='_';
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
ans[i][j]=-1;
for(register int i=2;i<n;++i){
if(a[i][1]=='6'){
ans[i-1][2]=1;
ans[i][2]=1;
ans[i+1][2]=1;
ans[i-1][1]=1;
ans[i][1]=1;
ans[i+1][1]=1;
}
if(a[i][m]=='6'){
ans[i-1][m-1]=1;
ans[i][m-1]=1;
ans[i+1][m-1]=1;
ans[i-1][m]=1;
ans[i][m]=1;
ans[i+1][m]=1;
}
}
for(register int i=2;i<m;++i){
if(a[1][i]=='6'){
ans[2][i-1]=1;
ans[2][i]=1;
ans[2][i+1]=1;
ans[1][i-1]=1;
ans[1][i]=1;
ans[1][i+1]=1;
}
if(a[n][i]=='6'){
ans[n-1][i+1]=1;
ans[n-1][i]=1;
ans[n-1][i-1]=1;
ans[n][i+1]=1;
ans[n][i]=1;
ans[n][i-1]=1;
}
}
if(a[n][1]=='4'){
ans[n][1]=1;
ans[n-1][1]=1;
ans[n][2]=1;
ans[n-1][2]=1;
}
if(a[1][m]=='4'){
ans[1][m]=1;
ans[1][m-1]=1;
ans[2][m]=1;
ans[2][m-1]=1;
}
if(a[1][1]=='4'){
ans[1][1]=1;
ans[1][2]=1;
ans[2][1]=1;
ans[2][2]=1;
}
if(a[n][m]=='4'){
ans[n][m]=1;
ans[n-1][m]=1;
ans[n][m-1]=1;
ans[n-1][m-1]=1;
}
for(register int i=2;i<n;++i)
for(register int j=2;j<m;++j)
if(a[i][j]=='9'){
ans[i-1][j-1]=1;
ans[i-1][j]=1;
ans[i-1][j+1]=1;
ans[i][j-1]=1;
ans[i][j]=1;
ans[i][j+1]=1;
ans[i+1][j-1]=1;
ans[i+1][j]=1;
ans[i+1][j+1]=1;
}
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
if(ans[i][j]==-1)GG(i,j);
for(register int i=1;i<=n;++i) {
for(register int j=1;j<=m;++j) {
if(a[i][j]!='_') {
work(i,j);
}
}
}
register int x = 0, y = 0;
for(register int i = 1; i <= n; ++i) {
for(register int j = 1; j <= m; ++j) {
if(ans[i][j] == -1) {
nxt[x][y] = i * 100 + j;
x = i; y = j;
}
}
}
nxt[x][y] = 114514;
x = nxt[0][0] / 100;
y = nxt[0][0] % 100;
dfs(x, y);
return 0;
}
我快要疯了