码迷,mamicode.com
首页 > 其他好文 > 详细

20200130还是宅在家的搜索入门训练

时间:2020-01-31 10:32:16      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:问题   sha   http   article   +=   全局   arp   else   detail   

是昨天的小结,昨天忘记写了今天补上

一天就做了两道题 害 有点难受

两道都是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还是宅在家的搜索入门训练

标签:问题   sha   http   article   +=   全局   arp   else   detail   

原文地址:https://www.cnblogs.com/tabshh/p/12244657.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!