求助卡常大师, 悬赏关注
查看原帖
求助卡常大师, 悬赏关注
395825
AThls123楼主2023/7/25 10:02

从 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;
}

我快要疯了

2023/7/25 10:02
加载中...