当前位置: 首页 > wzjs >正文

小规模企业做网站长春网站推广排名

小规模企业做网站,长春网站推广排名,西宁专业做网站公司,深圳哪个区最好目录 一、 题目 二、思路 (1)算法框架选择 (2)剪枝策略 具体来说就是: 三、代码 (1) 数据读取与初始化 (2) 检查当前填充是否符合要求 (3) 递归 DFS 进行填充 (4) 读取输入 & 调用 DFS (5) 完整代码 一…

目录

一、 题目

二、思路

(1)算法框架选择

(2)剪枝策略

具体来说就是:

三、代码

(1) 数据读取与初始化

(2) 检查当前填充是否符合要求

(3) 递归 DFS 进行填充

(4) 读取输入 & 调用 DFS

(5) 完整代码


一、 题目

9.像素放置 - 蓝桥云课

【将题目翻译过来就是】:

该游戏基于 n × m 的网格棋盘进行,每个网格可以是白色或黑色,并且某些网格内标注了数字 x(0 ≤ x ≤ 9)。

核心规则:

  • 每个带数字 x 的网格周围 8 个相邻格子(上下左右 + 左上、左下、右上、右下)中,必须恰好有 x 个格子被填充为黑色。

  • 其余未标注数字的网格可以自由填充。

  • 最终输出符合条件的填充方案,白色格子用 0 表示,黑色格子用 1 表示。

二、思路

这道题本质上是一个约束满足问题(CSP),每个数字格子对其九宫格区域内的黑色格子数施加了严格约束,我们需要在满足所有约束的条件下找到唯一的合法解,个人认为这个问题的挑战在于:

  1. 所有约束相互关联,修改一个格子可能影响多个数字区域

  2. 需要同时处理正向推导(根据已知约束确定颜色)和反向验证(尝试填充后检查约束)

  3. 必须确保解的唯一性

(1)算法框架选择

我们采用DFS框架,但与我们一般用传统DFS解题的区别在于:

  1. 非路径式搜索:不是寻找路径,而是构建完整的二维状态

  2. 顺序填充:按行优先顺序逐个填充格子(0,0)→(0,1)→...→(n-1,m-1)

  3. 随时验证:在填充过程中随时验证已确定的约束

(2)剪枝策略

当处理到格子(x,y)时,其左上方的格子(x-1,y-1)的后续填充操作不会再改变该格子的状态,这其实也就是说:

  1. 在填充(x,y)后,必须立即验证(x-1,y-1)的约束

  2. 当处理到行末(y=m-1)时,还需验证正上方格子(x-1,y)的约束

这种剪枝策略基于"最早失败"原则——一旦发现局部约束不满足,立即停止当前搜索路径,可以比较有效的减少时间复杂度

具体来说就是:
当前处理位置必须验证的约束位置
非行末(y<m-1)(x-1,y-1)
行末(y=m-1)(x-1,y-1)和(x-1,y)

弄明白了这两个问题,其实这个问题就比较轻松了,核心就是如何实现约束 

三、代码

(1) 数据读取与初始化

#include <iostream>
#include <algorithm>
using namespace std;const int MAX_N = 15;
int n, m;
char map[MAX_N][MAX_N];
int f[MAX_N][MAX_N]; // 存储填色方案
  • 由于 n, m ≤ 15,可以使用 15 × 15 的二维数组存储棋盘数据。

  • map[][] 用于存储输入的棋盘布局。

  • f[][] 用于存储填充方案(0 代表白色,1 代表黑色)。

(2) 检查当前填充是否符合要求

bool check(int x, int y) {if (map[x][y] == '_') return true; // 没有限制的网格,直接返回 trueint num = map[x][y] - '0';int cnt = 0; // 统计周围黑色格子的数量for (int i = -1; i <= 1; i++) {for (int j = -1; j <= 1; j++) {int newX = x + i, newY = y + j;if (newX < 0 || newX >= n || newY < 0 || newY >= m) continue; // 越界检查if (f[newX][newY] == 1) cnt++; // 统计黑色格子}}return cnt == num; // 若黑色格子数量符合 `x`,则返回 true
}
  • 遍历 3×3 的范围,统计黑色格子数量。

  • 若符合 x 约束,返回 true,否则返回 false

(3) 递归 DFS 进行填充

void dfs(int x, int y) {if (x == n) {for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) cout << f[i][j];cout << endl;}return;}// 计算下一步的坐标int nextX = (y == m - 1) ? x + 1 : x;int nextY = (y == m - 1) ? 0 : y + 1;// 先尝试填黑色f[x][y] = 1;if ((x == 0 || y == 0 || check(x-1, y-1)) && (y == m - 1 || check(x-1, y)))dfs(nextX, nextY);// 尝试填白色f[x][y] = 0;if ((x == 0 || y == 0 || check(x-1, y-1)) && (y == m - 1 || check(x-1, y)))dfs(nextX, nextY);
}
  • 递归填充每个网格,并在 x == n 时输出方案。

  • 由于每个格子可以填 01,因此分别尝试后递归调用 dfs

  • 在填充后,检查左上角及已填充区域是否仍满足 x 约束。

(4) 读取输入 & 调用 DFS

int main() {cin >> n >> m;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf(" %c", &map[i][j]); // 读取地图数据}}dfs(0, 0); // 递归填充return 0;
}
  • 读取棋盘信息,并调用 dfs(0,0) 开始填充。

  • 由于 scanf(" %c") 前有空格,可自动跳过空白符(空格、换行)。

(5) 完整代码

//每个格子都要填到,但是可能重复访问,比如先填黑色,再填白色
//如何解决重复访问且保证不会死循环:按顺序遍历格子
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
char map[15][15];
int f[15][15];//填色方案
bool check(int x,int y)
{if(map[x][y]=='_') return true;else {int num=map[x][y]-'0';int cnt=0;//涂黑的个数for(int i=-1;i<=1;i++){for(int j=-1;j<=1;j++){int newx=x+i,newy=y+j;if(newx<0||newx>=n||newy<0||newy>=m) continue;if(f[newx][newy]==1) cnt++;}}if(cnt==num) return true;else return false;}
}
void dfs(int x,int y)//剩余的可以填黑色的方格数,已经填过的方格数
{//按逐行逐列的顺序填充//全部填充完if(x==n) {//检查最后一行是否全满足条件//(还剩最后一行没有检查)for(int y=0;y<m;y++){if(!check(n-1,y)) return;//该方案不符合条件}//输出符合条件的方案for(int i=0;i<n;i++){for(int j=0;j<m;j++) cout<<f[i][j];cout<<endl;}return;}//每次填充完当前格子检查左上方格子是否合格//因为它的状态不会再被影响了,已经固定了//到达最后一列的情况要特殊判断,不仅要判断左上方还要判断上方,还涉及到换行if(y==m-1){//填黑色f[x][y]=1;//第一行不用检查,第一列只用检查上方if(x==0||check(x-1,y-1)&&check(x-1,y)||y==0&&check(x-1,y)) dfs(x+1,0);//换行//填白色 f[x][y]=0;if(x==0||check(x-1,y-1)&&check(x-1,y)||y==0&&check(x-1,y)) dfs(x+1,0);//换行}//最后一列之前只用检查左上方else{//填黑色f[x][y]=1;if(x==0||y==0||check(x-1,y-1)) dfs(x,y+1);//填白色f[x][y]=0;if(x==0||y==0||check(x-1,y-1)) dfs(x,y+1);}
}
int main()
{cin>>n>>m;for(int i=0;i<n;i++){//scanf前面加空格读换行 for(int j=0;j<m;j++) cin>>map[i][j];                   }dfs(0,0);return 0;
}

http://www.dtcms.com/wzjs/495803.html

相关文章:

  • 广东省网站建设信息流投放平台
  • 京东网站建设的经费预算种子搜索神器
  • 想花钱做网站怎么做关键词搜索数据
  • 有什么做任务得佣金的网站新闻头条今日要闻国内
  • 网站飘窗怎样做西安百度seo推广电话
  • 做网站 (公司)seo外包公司优化
  • 银川网站建设怎么样2023第二波疫情已经到来
  • 网站建设最高管理权限济南seo的排名优化
  • 网站定制的公司百度下载应用
  • 百度站长怎么做网站维护电脑培训班速成班
  • 上海哪家公司提供专业的网站建设seo怎么做整站排名
  • 做企业英语网站要注意哪些地推拉新接单平台
  • 电子商务的网站建设大连seo网站推广
  • 在家做兼职的网站国内网络推广渠道
  • asp室内装修装潢网站源码建网站软件工具
  • 南昌做网站seo网络销售公司经营范围
  • 铜仁市住房和城乡建设局网站百度关键词优化教程
  • 备案域名绑定网站优化大师兑换码
  • 做商城型网站武汉大学人民医院
  • 网站如何做a b测试游戏推广赚佣金的平台
  • 服务器网站建设网络推广深圳有效渠道
  • 做影视网站版权问题企业微信会话内容存档
  • 网站开发平台 eclipse什么是营销
  • wordpress安全监测兰州网络推广优化服务
  • 您有新信息 建设招标网官方网站百度新闻网站
  • 中国最好网站建设公司排名谷歌网站推广
  • 有哪些可以做调查的网站seo推广技巧
  • 263企业邮箱登陆入囗郑州seo线上推广系统
  • 网站开发的一般流程如何推广网站方法
  • php网站开发职责网络营销的特点是什么?