半个下午+半个晚上,写的稀烂,各种粗心小错误,今天状态不佳啊。

一个点一个点枚举,判断是否可以放灯的时候就扫他的上下左右是否放过灯,用vis标记放过灯的位置。

放完全图后,再判断是否满足障碍物周围恰有那么多灯。

一个个点枚举过去会产生一个问题,回朔的时候状态太多,所以加一个剪枝:当前点右边,如果是障碍物,那障碍物上面(上面一整条,不是上面那个点)如果都没有灯,则剪掉。

我们是一个个点枚举过去,为什么会产生上面还是空的呢?就是因为加了回朔,

题目没有规定每一行都要有放灯,所以可以一整行一个灯都没有,所以就会出现上面的情况

写的太烂了,看看思路就好,我的代码就直接无视掉吧,900+ms擦边过,贴一下仅供批评。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define min(x,y) x<y?x:y
int map[10][10];
int tmap[10][10];
int vis[10][10];
int n,m,ans;
struct node
{int x,y,num;
};
vector<node> b;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int N;
bool inmap(int x,int y)
{return x>=0&&x<n&&y>=0&&y<m;
}
bool can(int r,int c)
{if(map[r][c]!=-4) return false;for(int d=0;d<4;d++){int x=r,y=c;while(inmap(x+dx[d],y+dy[d])){x+=dx[d];y+=dy[d];if(vis[x][y]) return false;if(map[x][y]>=-1) break;}}int nx=r+dx[3],ny=c+dy[3];if(inmap(nx,ny)&&map[nx][ny]>=-1&&nx>=1){while(inmap(nx+dx[0],ny+dy[0])){if(vis[nx+=dx[0]][ny+=dy[0]]){return true;}}return false;}return true;
}
void creat(int x,int y)
{tmap[x][y]=-2;for(int i=x-1;i>=0;i--)if(map[i][y]>=-1) break;else tmap[i][y]=-3;for(int i=x+1;i<n;i++)if(map[i][y]>=-1) break;else tmap[i][y]=-3;for(int i=y-1;i>=0;i--)if(map[x][i]>=-1) break;else tmap[x][i]=-3;for(int i=y+1;i<m;i++)if(map[x][i]>=-1) break;else tmap[x][i]=-3;
}
bool isok()
{for(int i=0;i<n;i++)for(int j=0;j<m;j++)tmap[i][j]=map[i][j];for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(vis[i][j]) creat(i,j);for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(tmap[i][j]==-4) return false;for(int i=0;i<b.size();i++){int tot=0;for(int d=0;d<4;d++){int nx=b[i].x+dx[d];int ny=b[i].y+dy[d];if(inmap(nx,ny)&&tmap[nx][ny]==-2){tot++;}}if(tot!=b[i].num)return false;}return true;
}
void dfs(int v,int tot)
{if(tot>=ans) return;for(int i=v;i<N;i++){int x=i/m;int y=i%m;if(can(x,y)){vis[x][y]=1;dfs(i+1,tot+1);vis[x][y]=0;}}if(isok()){ans=min(tot,ans);}
}
int main()
{int t,x,y,v;node a;while(scanf("%d%d",&n,&m)&&(n||m)){N=n*m;b.clear();memset(map,-0x3f,sizeof(map));memset(vis,0,sizeof(vis));for(int i=0;i<n;i++)for(int j=0;j<m;j++)map[i][j]=-4;scanf("%d",&t);for(int i=1;i<=t;i++){scanf("%d%d%d",&x,&y,&v);x--;y--;map[x][y]=v;if(v!=-1){a.x=x;a.y=y;a.num=v;b.push_back(a);}}ans=inf;dfs(0,0);if(ans!=inf)printf("%d\n",ans);elseprintf("No solution\n");}return 0;
}

poj 2870 Light Up(dfs+剪枝,写的稀烂)相关推荐

  1. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  2. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  3. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  4. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  5. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  6. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  7. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

  8. 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)

    题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...

  9. DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山

    DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...

最新文章

  1. java操作跨页的word cell,利用itext 生成pdf,处理cell 跨页问题 [转]
  2. 工程路径网站图片路径的问题 绝对路径
  3. 性能:15个JavaScript本地存储技术的函数库和工具
  4. 的图片怎么循环渲染_十分钟教你做个炫酷的图片切换过度效果
  5. IO-01. 表格输出(5)
  6. linux img提取文件系统,Linux系统获取开发板的文件系统并打包成img文件
  7. sqlite developer注册码(转)
  8. AD9833数字信号发生器模块
  9. Linux- 控制 LED 灯设备(LED 子系统)
  10. LDO使用之热阻考虑
  11. 输出字母在字符串中位置索引 python
  12. vue封装请求 获取上传文件进度及设置超时时间
  13. Sublime Text 3 -mac版简体中文汉化教程
  14. pci总线定时协议_PCI协议
  15. 8.前端JavaScript之数据类型
  16. scau数据结构习题
  17. WIN10+CUDA9.2+ZED双目SDK 安装教程(无人驾驶,感知)
  18. 什么是JavaBean?
  19. 【论文速递】ECCV2022 - 密集高斯过程的小样本语义分割
  20. 疯狂的馒头(bzoj2054)

热门文章

  1. 大学计算机专业绩点在3.5算好,大学绩点3.5算什么水平 绩点低有哪些补救方法...
  2. 数据库学mysql python_mysql学习(4)python操作数据库
  3. matlab移相变压器,18脉移相变压器+三相不可控桥式整流的MATLAB仿真
  4. php 发邮件 带附件,PHP发送带有附件的电子邮件
  5. 手机端和电脑端小说应用体验点
  6. 认真学习系列:《计算机网络自顶向下方法》笔记
  7. a算法和a*算法的区别_游戏寻路中 A* 算法的改进
  8. 计算机组成与网络题库,计算机组成原理题库
  9. python制作日历并保存成excel_利用Python自动化生成逼格高的日历!简单又实用
  10. python xy不在第一维度_ValueError:x和y必须具有相同的第一个维度ipython 3.5