搜索 水题&&错误集锦
引子:
本以为搜索的题目老师也不会检查,结果今天早上loli慢悠悠的说:“请同学们提交一下搜索的题目~”,顿时心旌摇曳,却也只能装作镇定自若的样子,点了点头。。
然后就开始了今天的疯狂做题,虽说题目都不是太难,但题多势众啊...
刷了那么多题,小有收获,总结+复习一下,也是为了以后避免类似错误(十分直观而又影响巨大的)
所做题目链接:openjudge 2.5 题面不一一附上
1.letters
看到这道题,就想到了前几天刚刚学会的STLmap映射,然后没怎么想就敲了一遍代码,结果跑的巨慢无比,然后下去跑操想明白了不用这么麻烦的做法,直接用一个vis数组就是了,看来长时间不做搜索大脑都僵化了。。
其他的就没什么技术含量了,和dfs模板差不多,
细节:1.运算种的i循环0-3就是4次
2.起始点的vis为true
3.A-Z ascill码为65-90
代码:
#include<iostream>
#include<cstring> using namespace std; int fx[]={,,,-};
int fy[]={-,,,};
int ans=,d[][],n,m;
char a[][];bool vis[]; int dfs(int x,int y,int z)
{
ans=max(ans,z);
for(int i=;i<;i++)//细节
{
int xx=x+fx[i];
int yy=y+fy[i];
if(xx<=n&&xx>&&yy<=m&&yy>&&!vis[a[xx][yy]])
{
vis[a[xx][yy]]=true;
dfs(xx,yy,z+);
vis[a[xx][yy]]=false;
}
}
}
int main()
{
memset(vis,false,sizeof(vis));
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
vis[a[][]]=true;//细节
dfs(,,);
cout<<ans<<endl;
return ;
}
letters
2&&3.八皇后&&问题
例题八皇后问题引申出的各种问题,比较简单,+注意细节
细节:
1.横纵循环的次序,外层循环行号,内层循环列号
代码:
#include<iostream>
using namespace std;
int s=,n,ans[],h[]={},l[]={},a[]={},b[]={},anss[][];
void out()
{
s++;
for(int i=;i<=;i++)
anss[s][i]=ans[i];
}
int dfs(int k)
{
//cout<<"12 ";
for(int j=;j<=;j++)
{
if((h[j]==)&&(a[k+j]==)&&(b[k-j+]==))
{
ans[k]=j;
h[j]=;
a[k+j]=;
b[k-j+]=; if(k==)out();
else dfs(k+);
h[j]=;
a[k+j]=;
b[k-j+]=;
}
}
}
int main()
{
dfs();
cin>>n;
for(int i=;i<=n;i++)
{
int x;
cin>>x;
for(int k=;k<=;k++)
cout<<anss[x][k];
cout<<endl;
}
}
八皇后
#include<iostream>
using namespace std;
int s=,n,ans[],h[]={},l[]={},a[]={},b[]={},anss[][];
void out()
{
s++;
// if(s>4)return ;
cout<<"No. "<<s<<endl;
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
if(ans[j]==i)cout<<<<" ";
else
cout<<<<" ";
}
cout<<endl;
}
}
int dfs(int k)
{
//cout<<"12 ";
for(int j=;j<=;j++)
{
if((h[j]==)&&(a[k+j]==)&&(b[k-j+]==))
{
ans[k]=j;
h[j]=;
a[k+j]=;
b[k-j+]=; if(k==)out();
else dfs(k+);
h[j]=;
a[k+j]=;
b[k-j+]=;
}
}
}
int main()
{
// cin>>n;//cout<<"123";
dfs();
cin>>n;
// cout<<s;
for(int i=;i<=n;i++)
{
int x;
cin>>x;
for(int k=;k<=;k++)
cout<<anss[x][k];
cout<<endl;
}
}
八皇后问题
4.迷宫
这道题是我做openjudge交的最多的一道题,足足交了30次,自己的dfs不知道出现了什么问题,就是不对,总是5分。。。
看了看提问区,五分的解决方法就是判断起点和终点,可是我明明判断了,无奈。。。
唯一的细节就是题目给出的特判,所以收获也就只有好好看题。
5.红与黑
又是一道模板题,注意的地方就是输入的行列是反着来的,
代码:
#include <iostream>
#include <cstring>
using namespace std; int a[][];
int dx[]={,,,-},dy[]={,-,,};
int m,n,ans=,xe,ye; void dfs(int x,int y)
{
ans++;
a[x][y]=;
for(int i=;i<=;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<=m&&xx>&&yy<=n&&yy>&&a[xx][yy]==)
{
a[xx][yy]=;
dfs(xx,yy);
}
}
} int main()
{
while(cin>>n>>m)
{
memset(a,,sizeof(a));
ans=;
if(m==&&n==)break;
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
{
char x;
cin>>x;
if(x=='.')
a[i][j]=;
if(x=='@')
{
a[i][j]=;
xe=i,ye=j;
}
}
dfs(xe,ye);
cout<<ans<<endl;
}
return ;
}
红与黑
6.棋盘问题
这道题第一次交的时候WA0分,主要是因为没好好看题,'#' 的地方才可以放棋子,可是受了上一道题的影响,+盲目自信没试样例2导致了如此惨剧的发生
收获:好好看题X2!!
7.取石子游戏
这明明就是递归,不知道为什么放到搜索上来= =
注意每次是谁先手,这里num=1为player1放棋子,player1设为先手拿旗子,
用3目运算符小装了一手,感觉良好,
这道题写了两遍,主要注意取到0获胜的到底是递归上一层的player还是这一层的player,总归最后还是理清了思路。
代码:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm> using namespace std;
int f(long long a,long long b,int num)
{
if(a<b)swap(a,b);
if(b==)return num==?:;
if(a/b>=)return num;
a-=b;
return f(a,b,num==?:);
}
int main()
{
long long a,b;
while(cin>>a>>b)
{
if(a==&&b==)break;
if(f(a,b,)==)
cout<<"win"<<endl;
else
cout<<"lose"<<endl;
}
}
取石子游戏(递归)
8.马走日
和dfs模板略有不同的特点可能是八个方向吧,每次走到ans++就好,一次AC
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; int m,n,ans;
int dx[]={,,,,-,-,-,-},dy[]={,-,,-,,-,,-};
int vis[][];
void dfs(int x,int y,int s)
{
if(s>n*m)
{
ans++;
return;
}
for(int i=;i<;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=&&xx<=n-&&yy>=&&yy<=m-)
if(!vis[xx][yy])
{
vis[xx][yy]=;
dfs(xx,yy,s+);
vis[xx][yy]=;
}
}
}
int main()
{
int u,a,b;
cin>>u;
while(u--)
{
memset(vis,,sizeof(vis));
cin>>n>>m>>a>>b;
ans=;
vis[a][b]=;
dfs(a,b,);
cout<<ans<<endl;
}
}
马走日
9.单词接龙
记得当时刚来集训,和Juan_feng一起讨论后A掉了这道题(多亏我机智的+1,虽然不知道原理),高兴了一手,
不过听loli讲我们这样做的效率很低,直接把能不能连接,连接后长度增加多少,先预处理出一个二维数组就可以,不用每次都搜索,效率会快很多,深思熟虑后确实是这样,不过代码是之前的版本,有点小懒
代码:
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; int m,n,ans;
int dx[]={,,,,-,-,-,-},dy[]={,-,,-,,-,,-};
int vis[][];
void dfs(int x,int y,int s)
{
if(s>n*m)
{
ans++;
return;
}
for(int i=;i<;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=&&xx<=n-&&yy>=&&yy<=m-)
if(!vis[xx][yy])
{
vis[xx][yy]=;
dfs(xx,yy,s+);
vis[xx][yy]=;
}
}
}
int main()
{
int u,a,b;
cin>>u;
while(u--)
{
memset(vis,,sizeof(vis));
cin>>n>>m>>a>>b;
ans=;
vis[a][b]=;
dfs(a,b,);
cout<<ans<<endl;
}
}
单词接龙
10.分成互质组
一遍ac,小开心一手,
dfs每个数是加入之前的已经建立的组别 or 新开一个组
搜完统计一下组数就是了,
然后还有个剪枝:如果当前组别已经大于目前最优解就return,因为不可能对答案有贡献了,
这道题很怪异的是,我居然自己能把自己的错误卡掉,虽然效率低了一点。。
本来就打算拿部分分的,毕竟从来没有错误再卡掉的操作,结果ac了,有点开心
代码:
#include <iostream>
#define re register
#include <algorithm> using namespace std;
int n,a[],vis[],ans=,tot[],z[][]; int gcd(int x,int y)
{
if(y==)return x;
else
return gcd(y,x%y);
} void dfs(int k,int s)
{
if(s>=ans)return ;
if(k>n)
{
int pd=;
for(int i=;i<=s;i++)
pd+=tot[i];
if(pd!=n)return;//卡掉自己不知道为什么会出现的错误
ans=min(ans,s+);
return ;
}
for(re int i=;i<=s;i++)
{
bool flag=true;
for(int l=;l<=tot[i];l++)
{
if(gcd(z[i][l],a[k])!=)
{
flag=false;
break;
}
}
if(flag)
{
tot[i]++;
z[i][tot[i]]=a[k];
dfs(k+,s);
tot[i]--;
}
}
s++;
// cout<<s;
z[s][]=a[k];
tot[s]=;
dfs(k+,s);
s--;
tot[s]=;
} int main()
{
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i];
dfs(,);
// cout<<"daole";
cout<<ans;
}
分成互质组
11.分苹果
又是一道递归题,,
在OJ的递归和递推都有这道题,思维难度还是有的
代码:
#include<iostream>
using namespace std;
int put(int x,int y)
{
if((x==)||(y==)||(y==))
return ;
if(x<y)
return put(x,x);
if(x==y)
return put(x,y-)+;
if(x>y)
return put(x,y-)+put(x-y,y);
}
main()
{
int n,x,y;
cin>>n; for (int i=;i<=n;i++)
{
cin>>x>>y;
cout<<put(x,y)<<endl;
}
return ;
}
放苹果
啊终于写完了,
dfsOJ搜索水题的总结如上
搜索 水题&&错误集锦的更多相关文章
- hdu 1181:变形课(搜索水题)
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submis ...
- 搜索水题四连发_C++
特别声明:以下题目有部分为原创题,涉及版权问题,不得转载,违者追究 法律责任! 话说这是一套神题,只有你想不到,没有你做不到 题目更正后比 Pascal 跑得还快哈~ 一道特别裸,但是特别坑的搜索题 ...
- hdu3786 Floyd或搜索 水题
题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- uva 784 Maze Exploration 染色 搜索水题 DFS
染色问题,其实就是看看图上某一点能扩散多少. 用DFS解决,因为BFS不是很熟 =-=...以后要多练. 提交后32ms,优化了一下,在递归前进行判定,优化到22ms,不是优化的很好... 代码: # ...
- poj2386(dfs搜索水题)
Language:Default Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42069 ...
- DFS水题 URAL 1152 False Mirrors
题目传送门 /* 题意:一个圈,每个点有怪兽,每一次射击能消灭它左右和自己,剩余的每只怪兽攻击 搜索水题:sum记录剩余的攻击总和,tot记录承受的伤害,当伤害超过ans时,结束,算是剪枝吧 回溯写挫 ...
- BZOJ USACO 银组 水题集锦
最近刷银组刷得好欢快,好像都是水题,在这里吧他们都记录一下吧(都是水题大家一定是道道都虐的把= =)几道比较神奇的题到时再列出来单独讲一下吧= =(其实我会说是BZOJ蹦了无聊再来写的么 = =) [ ...
- <hdu - 3999> The order of a Tree 水题 之 二叉搜索的数的先序输出
这里是杭电hdu上的链接:http://acm.hdu.edu.cn/showproblem.php?pid=3999 Problem Description: As we know,the sha ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
随机推荐
- HTTP状态码302、303、307区别
HTTP状态码3XX表示重定向,表明浏览器需要执行某些特殊的处理以正确处理请求. 301 Moved Permanently 永久性定向.该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在 ...
- eclipse 内存溢出
2011年02月22日 星期二 11:14 eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M ec ...
- Perl学习笔记(2)----正则表达式数字匹配的一个疏忽
<Perl语言入门>第15章习题第2题如下: 用 given-when 结构写一个程序,根据输入的数字,如果它能被3整除,就打印“Fizz”:如果它能被5整除,就打印“Bin”:如果它能被 ...
- hdu 1159 Common Subsequence(LCS)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- tableview setData 设置数据(结构体对象)
定义设置的对象类型 Q_DECLARE_METATYPE(LISTITEMDATA *) 设置数据类型 LISTITEMDATA *ptask = &(const_cast<LISTIT ...
- DELPHI SOKET 编程--使用TServerSocket和TClientSocket
本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...
- python 测试:生成exe文件
任务: test.py print(input('请输入:')) 将test.py生成test.exe 解答: 安装: pip install pyinstaller 命令使用: (绝对地址)pyin ...
- HTML头部声明文件类型
在你每一个页面的顶端,你需要文件声明.是的,必须. 如果不指定文件类型,你的HTML不是合法的HTML,并且大部分浏览器会用“怪癖模式(quirks mode)”来处理页面,这意味着浏览器认为你自己也 ...
- Hadoop Archives档案
HDFS 并不擅长存储小文件,因为每个文件最少一个 block,每个 block 的元数据都会在 NameNode 占用内存,如果存在大量的小文件,它们会吃掉NameNode 节点的大量内存. Had ...
- MyEclipse中关于JRE System Library、Web App Libraries的疑惑
简要说明一下:其实,这三个都是jar包的存放集合. 1.JRE System Library主要存放J2SE的标准jar,一般不需要调整. 2.Referenced Libraries是存放第三方的j ...