poj 2870 Light Up(dfs+剪枝,写的稀烂)
半个下午+半个晚上,写的稀烂,各种粗心小错误,今天状态不佳啊。
一个点一个点枚举,判断是否可以放灯的时候就扫他的上下左右是否放过灯,用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+剪枝,写的稀烂)相关推荐
- 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 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- 【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 ...
- [DFS|剪枝] leetcode 22 括号生成
[DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...
- poj2248 DFS+剪枝 or BFS
传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...
- 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)
题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...
- DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山
DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...
最新文章
- java操作跨页的word cell,利用itext 生成pdf,处理cell 跨页问题 [转]
- 工程路径网站图片路径的问题 绝对路径
- 性能:15个JavaScript本地存储技术的函数库和工具
- 的图片怎么循环渲染_十分钟教你做个炫酷的图片切换过度效果
- IO-01. 表格输出(5)
- linux img提取文件系统,Linux系统获取开发板的文件系统并打包成img文件
- sqlite developer注册码(转)
- AD9833数字信号发生器模块
- Linux- 控制 LED 灯设备(LED 子系统)
- LDO使用之热阻考虑
- 输出字母在字符串中位置索引 python
- vue封装请求 获取上传文件进度及设置超时时间
- Sublime Text 3 -mac版简体中文汉化教程
- pci总线定时协议_PCI协议
- 8.前端JavaScript之数据类型
- scau数据结构习题
- WIN10+CUDA9.2+ZED双目SDK 安装教程(无人驾驶,感知)
- 什么是JavaBean?
- 【论文速递】ECCV2022 - 密集高斯过程的小样本语义分割
- 疯狂的馒头(bzoj2054)
热门文章
- 大学计算机专业绩点在3.5算好,大学绩点3.5算什么水平 绩点低有哪些补救方法...
- 数据库学mysql python_mysql学习(4)python操作数据库
- matlab移相变压器,18脉移相变压器+三相不可控桥式整流的MATLAB仿真
- php 发邮件 带附件,PHP发送带有附件的电子邮件
- 手机端和电脑端小说应用体验点
- 认真学习系列:《计算机网络自顶向下方法》笔记
- a算法和a*算法的区别_游戏寻路中 A* 算法的改进
- 计算机组成与网络题库,计算机组成原理题库
- python制作日历并保存成excel_利用Python自动化生成逼格高的日历!简单又实用
- python xy不在第一维度_ValueError:x和y必须具有相同的第一个维度ipython 3.5