搜索 水题&&错误集锦
引子:
本以为搜索的题目老师也不会检查,结果今天早上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[ ...
随机推荐
- Java—IO流 字节流
IO流(输入流.输出流),又分为字节流.字符流. 流是磁盘或其它外围设备中存储的数据的源点或终点. 输入流:程序从输入流读取数据源.数据源包括外界(键盘.文件.网络…),即是将数据源读入到程序的通信通 ...
- 针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除
尝试连接到 Linux 虚拟机 (VM) 时,有多种原因可能会导致安全外壳 (SSH) 错误.SSH 连接失败或被拒绝. 本文帮助用户找出原因并更正问题. 可以使用 Azure 门户.Azure CL ...
- npm install 安装项目依赖,报错ERR! Unexpected end of JSON input while parsing near的方法汇总
问题描述: npm install 安装项目依赖的时候,有时会出现: ERR! Unexpected end of JSON input while parsing near 错误 原因: npm 的 ...
- yii2.0发送qq邮件详情配置
首先要想使用qq发送邮件必须打开使用的qq邮箱里的一个配置,
- 通过CXF,开发soap协议接口
1. 引入cxf的jar包 pom文件里面直接增加依赖 < dependency> <groupId > junit</ groupId> <artifact ...
- ubuntu 18.4 鼠标右键菜单 添加文件
执行以下指令,在template文件夹中,增加一个空文件 touch ~/Templates/Empty\ Document
- 一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍
有好几位朋友在公众号后台给我留言询问SAP C/4HANA和S/4HANA集成的方案. 尽管我给这些朋友推送了一个方案:打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例,然而我得到的 ...
- GPRS研究(3):NO CARRIER错误的含义解释
NO CARRIER(必须是大写)是一个由猫向其所附着的设备(典型的就是一个计算机)发来的文本响应信息,表示猫没有连接到远程系统.NO CARRIER是由Hayes指令集定义的,由于Hayes猫的普及 ...
- sql语句中where,have,on的区别
一.where和on的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1. ...
- android 智能提示
<AutoCompleteTextView android:id="@+id/autoCompleteTextView" android:completionThreshol ...