20200130还是宅在家的搜索入门训练
Posted tabshh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20200130还是宅在家的搜索入门训练相关的知识,希望对你有一定的参考价值。
是昨天的小结,昨天忘记写了今天补上
一天就做了两道题 害 有点难受
两道都是dfs的题,本来想再做一个bfs,算辽,游戏时间还是打游戏比较快乐:)
感谢lyxdl帮我发现的问题(虽然现在有点忘了是哪四个了bmw)
1.全局int n差点弄死自己hhhhh和ldl
2.想图简便结果把自己坑到,其实现在也没想为什么不行,复杂度是为什么不对(就是懒没错,大概除了线代,现在没有哪个科目让我能一个点都不放过了emmmm
3.判断成立条件,对于这类需要枚举到底的题,可以加上判断是否到底的条件(像我那种带了打底的好像不用嘿嘿
4.忘了emmm不过我记得好像是小问题那就不管啦
以及ldl教的技巧:
1.2*n==n>>1
2.循环上限需要计算的时候,再初始条件处设置lim(先计算省时间??
3.TBC
===================================分割线===================================
记一下我俩写的代码对比
===================================分割线===================================
大佬的(其实就只有中间算法不一样
#include <iostream> #include <cstring> #include <queue> #include <math.h> #include <map> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; char a[20]={‘+‘},lis[]={‘ ‘,‘+‘,‘-‘}; int n; inline int read(){ int x=0,f=1;char c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f; } int realize(){ int f=1,ans=0,sum=0; for(int i=0;i<=(n<<1);i+=2){ if(a[i]!=‘ ‘) { ans+=f*sum,sum=a[i+1]-‘0‘; if(a[i]==‘+‘) f=1; else f=-1; } else { sum=sum*10+a[i+1]-‘0‘; } } if(ans==0) return 1; return 0; } void dfs(int m) { if(m==n){ if(realize()){ for(int i=1;i<=2*n-1;i++)cout<<a[i]; cout<<endl; } return; } a[m<<1]=lis[0];dfs(m+1); a[m<<1]=lis[1];dfs(m+1); a[m<<1]=lis[2];dfs(m+1); } int main() { n=read(); char j=‘1‘; for(int i=1;i<=2*n-1;i+=2,j++){a[i]=j;a[i+1]=‘ ‘;} a[0]=‘+‘,a[n<<1]=‘+‘; dfs(1); return 0; }
===================================分割线===================================
我滴(之前为了简洁差点把自己弄死于是干脆放飞自我
int realize(){ int out=0,temp=0,flag=0; for(int i=0;i<=2*n-1;i+=2){ temp=temp*10+(a[i+1]-‘0‘); if(a[i+2]==‘ ‘ && i+2<=2*n-1){ if(flag)continue; if(a[i]==‘+‘){flag=1;continue;} else if(a[i]==‘-‘){flag=-1;continue;} } else if(a[i]==‘+‘){flag=1;} else if(a[i]==‘-‘){flag=-1;} out+=flag*temp;temp=0;flag=0; } if(!out)return 1; return 0; }
===================================分割线===================================
以及ldl的古早代码
#include <iostream> #include <cstring> #include <queue> #include <math.h> #include <map> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; char a[20]={‘+‘},lis[]={‘ ‘,‘+‘,‘-‘}; int n; inline int read(){ int x=0,f=1;char c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f; } int realize(){ int f=1,ans=0,sum=0; for(int i=0;i<=(n<<1);i+=2){ if(a[i]!=‘ ‘) { ans+=f*sum,sum=a[i+1]-‘0‘; if(a[i]==‘+‘) f=1; else f=-1; } else { sum=sum*10+a[i+1]-‘0‘; } } if(ans==0) return 1; return 0; } void dfs(int m) { if(m==n){ if(realize()){ for(int i=1;i<=2*n-1;i++)cout<<a[i]; cout<<endl; } return; } a[m<<1]=lis[0];dfs(m+1); a[m<<1]=lis[1];dfs(m+1); a[m<<1]=lis[2];dfs(m+1); } int main() { n=read(); char j=‘1‘; for(int i=1;i<=2*n-1;i+=2,j++){a[i]=j;a[i+1]=‘ ‘;} a[0]=‘+‘,a[n<<1]=‘+‘; dfs(1); return 0; }
转一个bfs模板
https://blog.csdn.net/cj1064789374/article/details/84888889
以上是关于20200130还是宅在家的搜索入门训练的主要内容,如果未能解决你的问题,请参考以下文章