解题思路:

注意事项:

参考代码:

#include<iostream>

using namespace std;

const int dx[9]={0,0,0,1,-1,1,1,-1,-1};

const int dy[9]={0,1,-1,0,0,-1,1,1,-1};

int visit[15][15];//表示需要填的数目;

int ans[15][15];//答案;

int n,m,flag=0;

int around(int x,int y)

{

   int res=0;

   for(int i=0;i<=8;i++){

      int nx=x+dx[i],ny=y+dy[i];

      if(nx<=0||ny<=0||nx>n||ny>m||ans[nx][ny]==0) continue;

      res++;

   }

   return res;

bool check(int x,int y){//x是行数,y是列数,不要和坐标系里面的东西混淆了! 

if(visit[x][y]==-1) return true;

if(around(x,y)==visit[x][y]) return true;

return false;

}

void dfs(int x,int y){

if(x==n+1){

for(int i=max(1,n-1);i<=n;i++){

for(int j=1;j<=m;j++){

if(!check(i,j))  return;

}

flag=1;

return;

}

if(y==m){

if(!flag)ans[x][y]=0;//默认填0;

  if(x==1||(check(x-1,y)&&(y==1||check(x-1,y-1)))){//第一行可以直接下去

     if(!flag) dfs(x+1,1);

        }

        //不行,那就。

if(!flag)ans[x][y]=1;

        if(x==1||(check(x-1,y)&&(y==1||check(x-1,y-1)))){//第一行可以直接下去

     if(!flag) dfs(x+1,1);

        }

        return;

}

      if(!flag)ans[x][y]=0;//默认填0;

if(y==1||x==1||check(x-1,y-1)){//第一列可以直接向右移动 

     if(!flag) dfs(x,y+1);

        }

        //不行,那就。

if(!flag)ans[x][y]=1;

        if(y==1||x==1||check(x-1,y-1)){//第一行可以直接下去

     if(!flag) dfs(x,y+1);

        }

}

int main(){

cin>>n>>m;

for(int i=1;i<=n;i++){

char ch;

for(int j=1;j<=m;j++){

cin>>ch;

if(ch=='_') visit[i][j]=-1;

else visit[i][j]=ch-'0';

}

}

dfs(1,1);

for(int i=1;i<=n;i++){

for(int j=1;j<=m;j++)

cout<<ans[i][j];

cout<<endl;

}

}


点赞(0)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

gggo 10月前 回复TA
太乱了