是昨天的小结,昨天忘记写了今天补上
一天就做了两道题 害 有点难受
两道都是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
原文:https://www.cnblogs.com/tabshh/p/12244657.html