引子:

本以为搜索的题目老师也不会检查,结果今天早上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搜索水题的总结如上

搜索 水题&&错误集锦的更多相关文章

  1. hdu 1181:变形课(搜索水题)

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submis ...

  2. 搜索水题四连发_C++

    特别声明:以下题目有部分为原创题,涉及版权问题,不得转载,违者追究 法律责任! 话说这是一套神题,只有你想不到,没有你做不到 题目更正后比 Pascal 跑得还快哈~ 一道特别裸,但是特别坑的搜索题 ...

  3. hdu3786 Floyd或搜索 水题

    题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. uva 784 Maze Exploration 染色 搜索水题 DFS

    染色问题,其实就是看看图上某一点能扩散多少. 用DFS解决,因为BFS不是很熟 =-=...以后要多练. 提交后32ms,优化了一下,在递归前进行判定,优化到22ms,不是优化的很好... 代码: # ...

  5. poj2386(dfs搜索水题)

    Language:Default Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42069   ...

  6. DFS水题 URAL 1152 False Mirrors

    题目传送门 /* 题意:一个圈,每个点有怪兽,每一次射击能消灭它左右和自己,剩余的每只怪兽攻击 搜索水题:sum记录剩余的攻击总和,tot记录承受的伤害,当伤害超过ans时,结束,算是剪枝吧 回溯写挫 ...

  7. BZOJ USACO 银组 水题集锦

    最近刷银组刷得好欢快,好像都是水题,在这里吧他们都记录一下吧(都是水题大家一定是道道都虐的把= =)几道比较神奇的题到时再列出来单独讲一下吧= =(其实我会说是BZOJ蹦了无聊再来写的么 = =) [ ...

  8. <hdu - 3999> The order of a Tree 水题 之 二叉搜索的数的先序输出

    这里是杭电hdu上的链接:http://acm.hdu.edu.cn/showproblem.php?pid=3999  Problem Description: As we know,the sha ...

  9. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

随机推荐

  1. Java—IO流 字节流

    IO流(输入流.输出流),又分为字节流.字符流. 流是磁盘或其它外围设备中存储的数据的源点或终点. 输入流:程序从输入流读取数据源.数据源包括外界(键盘.文件.网络…),即是将数据源读入到程序的通信通 ...

  2. 针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除

    尝试连接到 Linux 虚拟机 (VM) 时,有多种原因可能会导致安全外壳 (SSH) 错误.SSH 连接失败或被拒绝. 本文帮助用户找出原因并更正问题. 可以使用 Azure 门户.Azure CL ...

  3. npm install 安装项目依赖,报错ERR! Unexpected end of JSON input while parsing near的方法汇总

    问题描述: npm install 安装项目依赖的时候,有时会出现: ERR! Unexpected end of JSON input while parsing near 错误 原因: npm 的 ...

  4. yii2.0发送qq邮件详情配置

    首先要想使用qq发送邮件必须打开使用的qq邮箱里的一个配置,

  5. 通过CXF,开发soap协议接口

    1. 引入cxf的jar包 pom文件里面直接增加依赖 < dependency> <groupId > junit</ groupId> <artifact ...

  6. ubuntu 18.4 鼠标右键菜单 添加文件

    执行以下指令,在template文件夹中,增加一个空文件 touch ~/Templates/Empty\ Document

  7. 一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍

    有好几位朋友在公众号后台给我留言询问SAP C/4HANA和S/4HANA集成的方案. 尽管我给这些朋友推送了一个方案:打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例,然而我得到的 ...

  8. GPRS研究(3):NO CARRIER错误的含义解释

    NO CARRIER(必须是大写)是一个由猫向其所附着的设备(典型的就是一个计算机)发来的文本响应信息,表示猫没有连接到远程系统.NO CARRIER是由Hayes指令集定义的,由于Hayes猫的普及 ...

  9. sql语句中where,have,on的区别

    一.where和on的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.  在使用left jion时,on和where条件的区别如下:   1. ...

  10. android 智能提示

    <AutoCompleteTextView android:id="@+id/autoCompleteTextView" android:completionThreshol ...