dfs___刷题记录
poj 1564
给出一个s,n个数,输出所有的能够得到s的方案
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int a[];
int ans[];
int n,s,flag; void dfs(int x,int sum,int cnt){
if(sum > s) return;
if(sum == s){
flag = ;
printf("%d",ans[]);
for(int i = ;i < cnt;i++) printf("+%d",ans[i]);
printf("\n");
} for(int i = x;i < n;i++){
ans[cnt] = a[i];
dfs(i+,sum+a[i],cnt+);
while(i+ < n && a[i] == a[i+]) i++;
}
} int main(){
while(scanf("%d %d",&s,&n) != EOF && s){
for(int i = ;i < n;i++) scanf("%d",&a[i]);
printf("Sums of %d:\n",s);
flag = ;
dfs(,,);
if(!flag) printf("NONE\n");
}
return ;
}
poj 2488
骑士周游列国
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int res[][];
int vis[][]; int dir[][] = {-,-, -,, -,-, -,, ,-, ,, ,-, ,}; int m,n;
int flag; void dfs(int x,int y,int cnt){
if(flag) return;
res[cnt][] = x;res[cnt][] = y;
if(cnt == n*m) {
flag = ;
for(int i = ;i <= n*m;i++)
printf("%c%d",res[i][]-+'A',res[i][]);
printf("\n");
return;
} for(int i = ;i < ;i++){
int xx = x+ dir[i][];
int yy = y+ dir[i][];
if(!vis[xx][yy] && xx> && xx <= n && yy > && yy <= m){
vis[xx][yy] = ;
dfs(xx,yy,cnt+);
vis[xx][yy] = ;
}
}
} int main(){
int T;
scanf("%d",&T);
int kase = ;
while(T--){
scanf("%d %d",&m,&n); memset(vis,,sizeof(vis));
vis[][] = ; printf("Scenario #%d:\n",++kase);
flag = ;
dfs(,,); if(!flag) printf("impossible\n");
if(T) printf("\n"); }
return ;
}
poj 3009
这道题自己没有写出来
后来和题解比较了一下,这几个地方写错了
把障碍物击碎后的状态,先改成0搜一遍,等搜完还要再改回1,是为了搜到以后的所有情况
找到起点后,把起点改成0
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std; const int INF = ;
int g[][];
int vis[][];
int n,m;
int sx,sy,ex,ey;
int flag,ans;
int dir[][] = {,,,,-,,,-}; int in(int x,int y){
if(x >= && x <= m && y >= && y <= n) return ;
return ;
} void dfs(int x,int y,int step){
if(step > ) return; int i,xx,yy;
for( i = ;i < ;i++){
xx = x+dir[i][];
yy = y+dir[i][]; if(step < ans && in(xx,yy) && g[xx][yy] != ){
while(g[xx][yy] == && in(xx,yy)){
xx +=dir[i][];
yy +=dir[i][];
}
int xx2 = xx-dir[i][];
int yy2 = yy-dir[i][];
if(in(xx,yy)){
if(g[xx][yy] == ){
ans = step+;
return;
}
if(g[xx][yy] == ){
g[xx][yy] = ;//碰到障碍物,将障碍物清除
dfs(xx2,yy2,step+);
g[xx][yy] = ;//这一次dfs完后改回来是为了遍历完以后的所有情况
}
}
}
}
} int main(){
while(scanf("%d %d",&n,&m) != EOF && (m+n)){//输入的是n行m列
memset(g,,sizeof(g));
for(int i = ;i <= m;i++){
for(int j = ;j <= n;j++){
scanf("%d",&g[i][j]);
if(g[i][j] == ) {
sx = i,sy = j;
g[i][j] = ;
}
}
} ans = ;
dfs(sx,sy,);
if(ans > ) printf("-1\n");
else printf("%d\n",ans);
}
return ;
}
poj 1321
给出棋盘,旗子摆放不能同行或者同列,问放k个有多少种办法
感觉和poj 1564有一点点像,搜行,看对应的列是否被占用
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long LL;
char g[][];
int vis[];
LL ans;
int n,k; void dfs(int x,int cnt){
if(cnt == k){
ans++;
// printf("ans = %d\n",ans);
return;
}
for(int i = x;i <= n;i++){
for(int j = ;j <= n;j++){
if(g[i][j] == '#' && !vis[j]){
vis[j] = ;
dfs(i+,cnt+);
vis[j] = ;
}
}
}
} int main(){
while(scanf("%d %d",&n,&k) != EOF){
if(n == - && k == -) break;
for(int i = ;i <= n;i++)
for(int j = ;j <= n;j++) cin>>g[i][j]; ans = ;
dfs(,);
printf("%I64d\n",ans);
}
return ;
}
uva 11396
给出一个无向图,再给出一个爪形,问这个无向图是否能够分成一个个爪形的单元
判断是否是二分图
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std; const int maxn = ;
vector<int> g[maxn];
int color[maxn];
int n; bool bipartite(int u){
for(int i = ;i < g[u].size();i++){
int v = g[u][i];
if(color[v] == color[u]) return false;
if(!color[v]) {
color[v] = -color[u];
if(!bipartite(v)) return false;
}
}
return true;
} int main(){
int u,v;
while(scanf("%d",&n) != EOF && n){
for(int i = ;i <= n;i++) g[i].clear();
while(scanf("%d %d",&u,&v) != EOF){
if(u == && v == ) break;
g[u].push_back(v);g[v].push_back(u);
}
memset(color,,sizeof(color));
color[] = ;
if(bipartite()) puts("YES");
else puts("NO");
}
return ;
}
dfs___刷题记录的更多相关文章
- PE刷题记录
PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
- 刷题记录:[HarekazeCTF2019]encode_and_encode
目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...
- 刷题记录:[De1CTF 2019]Giftbox && Comment
目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...
- 刷题记录:[强网杯 2019]Upload
目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...
- 刷题记录:[XNUCA2019Qualifier]EasyPHP
目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...
- 刷题记录:[DDCTF 2019]homebrew event loop
目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...
- 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System
目录 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System 知识点 1.padding-oracle attack 2.cbc字节翻转攻击 3.FFMpeg文件读取漏 ...
随机推荐
- 06《UML大战需求分析》之六
不知不觉中,大多数课程的学习已经接近了尾声,<UML大战需求分析>这本书也陪伴了我们很久.在学习的过程中,我发现很多课程中其实都离不开UML.足以证明,UML在需求分析中的重大作用和在我们 ...
- Dynamics CRM Online 快速的debug 方法
这里的前提想大家了解一下. Dynamics 365 online的产品的session是30分钟 timeout. 如果你logout之后, session还是会储存在服务器端不会release. ...
- vue.js怎样将时间戳转化为日期格式
<!-- value 格式为13位unix时间戳 --><!-- 10位unix时间戳可通过value*1000转换为13位格式 --> export function for ...
- PHP 常用 数组函数
1:array_push($arr,'添加的值') 往数组里面添加元素2:array_unique($arr) 去重函数3:array_reverse($arr) 倒叙排列
- 团体程序设计天梯赛-练习集-L1-026. I Love GPLT
L1-026. I Love GPLT 这道超级简单的题目没有任何输入. 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了. 所谓“竖着输出”,是指每个字符占一行(包括空 ...
- shell中的交互模式:expect
在shell开发中,我们连接FTP或者passwd或sudo等操作时,需要手动输入密码.对于自动化而言,这显然是不合适的.而expect的强交互模式解决了这个问题.工作中偶有涉及到这个,个人也是简单的 ...
- [bzoj 2726] 任务安排 (斜率优化 线性dp)
3月14日第三题!!!(虽然是15号发的qwq) Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3-N.这N个任务被分成若干批 ...
- 使用maven创建web项目时后面多出来Maven Webapp如何删除
类似这样: 解决办法:
- [Office]PPT 2013如何设置图片为半透明?
PPT里面似乎无法直接为图片设置透明度属性.下面是一种变通的办法. 1,插入一个和图片大小一致的图形(矩形):2,右键插入的矩形,然后在属性设置里选择“图片填充”,选择以需要的图片填充到该矩形里:3, ...
- HDU 5168
把边按权值排序后,就相当于求一个子序列以1开始和以n结束.由于边权递增,而且相差>=k,所以,边的顺序也必定是递增的.知道,当处理一条出边时,必定是从入边选择一条最优的边,考虑两个因素,入边的权 ...