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文件读取漏 ...
随机推荐
- 软件神器系列——photozoom图片像无损清晰放大软件砸金蛋活动开始啦!
不管是刚进入社会的小白,还是混迹多年的油条,是不是发现了最近的工作越来越难做了? 推广文章.产品手册.营销方案.培训计划.工作报告乃至于PPT,都不是以前用文字数据可以交工的了,现在都讲究“图文并茂” ...
- 347. 前K个高频元素
题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = ...
- 远程连接windows出现身份验证错误,提示"由于CredSSP加密Oracle修正"解决方案
本机操作系统(OS版本:10.0.17134) 远程计算机操作系统(OS版本:6.3.9600) 远程连接的时候报错“出现身份验证错误,要求的函数不受支持.远程计算机:xxx 这可能是由于CredSS ...
- JSCH实现文件上传下载至sftp服务器
文件服务器采用FreeSSHd,文件服务器配置就不细说了. 直接上代码,该代码可以直接使用. import com.jcraft.jsch.*; import java.io.InputStream; ...
- [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...
- Python for Xpath
# Xpath- 在XML文件中查找信息的一套规则/语言,根据XML的元素或者属性进行遍历 ## Xpath开发工具- 开源的Xpath表达式编辑工具:XMLQuire- Chrome插件:Xpath ...
- VR开发2015年终总结
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50617605 作者:car ...
- 经纬度计算两点间的距离,根据距离排序SQL
#java的Utilspublic class DistanceUtil { // 地球平均半径 private static final double EARTH_RADIUS = 6378137; ...
- 简述Web Service通讯技术的搭建流程
Web Service 基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级 ...
- nyoj 803 大数问题
#include<stdio.h> #include<string.h> #define ll long long #define N 110000 int main() { ...