题目背景
上元佳节,庙会里举办着各式各样的庆典活动,牛宝也兴奋地参与其中。突然,他被一个新颖的点灯游戏所吸引,游戏要求最终点亮所有在场的花灯,每盏灯都有开关两种状态,每一次点击在场的一盏任意状态的花灯,其自身和四周的的花灯都会改变其开关状态。

例如

3*3的花灯阵

0 1 1

1 0 0

1 0 1

点一下最中间的灯【2,2】就变成了

0 0 1

0 1 1

1 1 1

再点一下左上角的灯【1,1】就变成了

1 1 1

1 1 1

1 1 1

最终输出点亮花灯的序号(从左上角到右下角序号依次为1-9),答案即点亮1号灯和5号灯。 为了奖品,牛宝只能尝试破解3*3的花灯阵,你能协助他吗?

题目描述
给出3*3的花灯阵各盏花灯的初始开关状态,请你按照序号从小到大的顺序点亮花灯(从左上角到右下角序号依次为1-9),同时要求点亮的次数最少(避免多余的点亮步骤),使得最终全部花灯均被点亮。

输入格式
九个数字,3*3的格式输入,每两个数字中间只有一个空格,表示灯初始的开关状态。(0表示关,1表示开)

输出格式
按照序号从小到大的顺序点亮花灯(从左上角到右下角序号依次为1-9),输出点亮的序号集合(每两个序号之间用空格隔开)。

输入输出样例
输入
0 1 1
1 0 0
1 0 1
输出
1 5
说明/提示
牛宝正在脑海中不停地进行尝试。。。

解题思路:
从左上到右下1-9的顺序进行点亮深搜,一旦点亮该灯,自身和其四周灯亮灭情况变化,保留点亮过程灯号;
深搜这条路径无法点亮所有的灯则进行回溯,自身和其四周灯亮灭情况变化。
深搜边界条件即点亮所有的灯,一旦有更少步数的进行更新方案。

代码如下:

#include <iostream>
using namespace std;
const int N = 5;
int g[N][N];
int ans = 10;
int path[10];
bool vis[10];
int paths[10];void turn(int x, int y) { //开关灯g[x][y] = 1 - g[x][y];g[x - 1][y] = 1 - g[x - 1][y];g[x + 1][y] = 1 - g[x + 1][y];g[x][y + 1] = 1 - g[x][y + 1];g[x][y - 1] = 1 - g[x][y - 1];
}void dfs(int n) {if (n > ans)return ;//剪枝,不剪枝会超时//超过最小的次数就返回,初始次数为10,规律:它总共步骤不会超过9次int sum = 0;for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)sum += g[i][j];if (sum == 9) {ans = min(ans, n - 1);for (int i = 1; i <= ans; i++) {paths[i] = path[i];}return ;}for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++) {turn(i, j);path[n] = (i - 1) * 3 + j;//将二维数组转换为一维dfs(n + 1);turn(i, j);}}int main() {for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)cin >> g[i][j];dfs(1);for (int i = 1; i <= ans; i++) {cout << paths[i] << " ";}return 0;
}

当然,因为按2下等于没有按,所以我们可以增加一个标记数组,这样就会少按很多重复的无效的次数,相当于剪枝。

代码如下:

#include <iostream>
using namespace std;
const int N = 5;
int g[N][N];
int ans = 10;
int path[10];
int paths[10];
bool vis[N][N];void turn(int x, int y) { //开关灯g[x][y] = 1 - g[x][y];g[x - 1][y] = 1 - g[x - 1][y];g[x + 1][y] = 1 - g[x + 1][y];g[x][y + 1] = 1 - g[x][y + 1];g[x][y - 1] = 1 - g[x][y - 1];
}void dfs(int n) {if (n > ans)return ;//剪枝,不剪枝会超时//超过最小的次数就返回,初始次数为10,规律:它总共步骤不会超过9次int sum = 0;for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)sum += g[i][j];if (sum == 9) {ans = min(ans, n - 1);for (int i = 1; i <= ans; i++) {paths[i] = path[i];}return ;}for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++) {if (!vis[i][j]) {vis[i][j] = true;turn(i, j);path[n] = (i - 1) * 3 + j;//将二维数组转换为一维dfs(n + 1);vis[i][j] = false;turn(i, j);}}}int main() {for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)cin >> g[i][j];dfs(1);for (int i = 1; i <= ans; i++) {cout << paths[i] << " ";}return 0;
}

当然,如果你想不到怎么把二维数组转换为一维,也可以这样写:

#include<bits/stdc++.h>
using namespace std;
int s[5][5];int book[5][5];int small=10;
int t[10];
int tt[10];
int change(int x,int y)
{s[x][y]=1-s[x][y];s[x-1][y]=1-s[x-1][y];s[x+1][y]=1-s[x+1][y];s[x][y-1]=1-s[x][y-1];s[x][y+1]=1-s[x][y+1];return 0;
}
int dfs(int k)
{if(k>small)return 0;int sum=0;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){sum+=s[i][j];}}if(sum==9){if(k<small){small=k;for(int i=1;i<=k;i++){tt[i]=t[i];}}return 0;}for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){if(book[i][j]==0){if(i==1&&j==1)t[k+1]=1;if(i==1&&j==2)t[k+1]=2;if(i==1&&j==3)t[k+1]=3;if(i==2&&j==1)t[k+1]=4;if(i==2&&j==2)t[k+1]=5;if(i==2&&j==3)t[k+1]=6;if(i==3&&j==1)t[k+1]=7;if(i==3&&j==2)t[k+1]=8;if(i==3&&j==3)t[k+1]=9;change(i,j);book[i][j]=1;dfs(k+1);change(i,j);book[i][j]=0;} }}return 0;
}
int main()
{for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){cin>>s[i][j];}}dfs(0);for(int i=1;i<=small;i++){cout<<tt[i]<<" ";}return 0;
}

上元节的灯会(亮)-dfs相关推荐

  1. 南京秦淮灯会亮灯迎春 明城墙内外“飘”年味

    1月28日晚,第33届中国秦淮灯会正式亮灯,南京明城墙上下.秦淮河畔,各形各色的彩灯洋溢着出浓郁的年味. 城墙上的灯饰多彩绚丽. 秦淮河上的灯饰. 各形各色的彩灯洋溢着出浓郁的年味. (中新社记者 泱 ...

  2. 上元节的灯会(灭)-区间dp

    题目背景 上元节的庙会上,牛宝靠自己的聪明才智成功破解了花灯阵,点亮了在场所有花灯,但他没料到的是这个游戏包含AB两个项目,A项目就是点亮所有花灯,而B项目则是熄灭所有花灯.不过点亮的是花灯阵,熄灭的 ...

  3. 上海豫园新春民俗艺术灯会亮灯 “财神猪”受热捧

    中新网上海1月22日电 (郑莹莹)2019上海豫园新春民俗艺术灯会21日正式亮灯,在豫园商城华宝楼广场,高达9米.憨态可掬的卡通财神猪手捧福袋和金元宝,向市民和游客送上新春祝福,卡通财神猪刚亮相,就吸 ...

  4. 三个彩灯循环点亮程序_近百组彩灯点亮江畔,义渡灯会正式亮灯啦

    10月23日晚上,大渡口区义渡古镇华灯初上.夜幕之下,2020第一届义渡灯会亮灯仪式在此举行,来自四川的近百组彩灯将在这里点亮夜空,一直陪伴广大市民游客至明年元宵节后. 当晚6点半,义渡灯会亮灯仪式正 ...

  5. STC89C52单片机 点亮LED灯

    点亮LED灯 一.什么是LED LED全称为半导体发光二极管,采用半导体材料制成的,以直接将电能转化为光能,电号转换成光信号的发光器件:其特点是功耗低.高亮度.色彩艳丽.坑振动.寿命长(正常发光8-1 ...

  6. 最小系统板 STM32入门,点亮 LED 灯(STM32F103C6T6)

    Hello, I'm Shendi 最近开整单片机,这里记录一下 我目前配置,最小系统板 STM32F103C6T6,ST-LINK V2 最小系统板,通电后PWR灯会亮,ST-LINK插上电脑后也会 ...

  7. 25、基于51单片机声控光控灯红外人体感应控制声光控开关亮灭设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Proteus仿真 七.程序源码 八.资料包括 摘要 随着社会的不断进步 ...

  8. 计算机网口信号灯常亮电源灯不亮,腾达路由器lan接口灯不亮怎么办? | 192路由网...

    前几天有个网友,问了我这样一个问题: 这位朋友说他家腾达路由器的LAN接口灯不亮,问我是不是坏掉了. 其实路由器的LAN接口灯不亮,并不一定就是路由器坏掉了,需要根据实际情况来分析的. 一般普通的腾达 ...

  9. 你管这破玩意叫 CPU ?

    点击关注公众号,Java干货及时送达 每次回家开灯时你有没有想过,用你按的简单开关实际上能打造出复杂的 CPU 来,只不过需要的数量会比较多,也就几十亿个吧. 伟大的发明 过去200年人类最重要的发明 ...

最新文章

  1. Centos 7.2搭建MariaDB数据库服务器应用与管理
  2. 微信小程序中用setData修改一个对象的属性值
  3. was这么做的负载均衡_中间件(WAS、WMQ)运维 9个常见难点解析
  4. 关于表格动态添加行并处理相关表单元素的一些修改
  5. .net IDE 界面编程AutoScale属性惹的大麻烦
  6. 雅虎正开发聊天机器人挑战对手 不过似乎很难成功
  7. 移动互联网下一步:“深度学习”配合大数据
  8. POJ 2798:二进制转换十六进制
  9. 关于mysql内存表的一个帖子(转载)
  10. 大二上数据结构复习2
  11. 快速查找Hashtable中的元素
  12. SharePoint 2010: Claims-based Authentication
  13. mysql 日期与索引问题
  14. python画图时常用的颜色——color=‘ ’
  15. PhotoZoom2020pro激活序列号秘钥下载8版安装教程
  16. C++ Socket网络编程
  17. 数学基础知识:数据统计
  18. 农产品销售系统的设计与实现
  19. 滴滴柳青:一个比你有才,又比你努力的富二代!
  20. 多周期MACD趋势共振制作的方法

热门文章

  1. C#中泛型在Class上的实现
  2. linux之setsid命令
  3. python3 爬虫第三步 本文包你学会正则 不会就来锤我
  4. 16岁上大学,25岁博士毕业,她还是南大医学院最年轻的博导!
  5. 除了 Python ,这些语言写的机器学习项目也很牛
  6. 深度学习与机器学习到底什么关系?
  7. 传说中理科生看到会沉默、文科生看到会流泪的【程序员文史综合题目】
  8. c++ 与 java_Java与C++比较
  9. easyui数据请求两个url_jQuery Easyui datagrid连续发送两次请求问题
  10. 重点客户销售数据分析python_药品销售数据分析--python