【洛谷】搜索专题
前言
我搜索超级辣鸡的qaq,都是胡乱搜,各种回溯...
有的时候都能多会回一遍,减成负的(蠢死了)
1.P1019 单词接龙
思路_(:з」∠)_
爆搜。。。不想说话。。。
坑点o_O
①我回溯写错了qaq
②改变的长度求成了一共的长度,加多了qaq
代码酱=u=
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int n,ans,s; //n<=20
string a,b;
char op;
struct words {
int first,last,len,c;
string v;
void emm() { c=0; }
bool operator < (const words &qwq ) const {
return len > qwq.len;
}
}w[N];
int check(int i,int j) {
a=w[i].v,b=w[j].v;
int lena=w[i].len,lenb=w[j].len;
int u=lena-1,ret=-1;
while(u>=0) {
if(a[u]==b[0]) {
bool flag=true;
int p,q;
for(p=u,q=0; p<lena; p++,q++)
if(a[p]!=b[q]) {
flag=false;
break;
}
if(p==lena && flag && lenb+u-lena>ret) ret=lenb+u-lena;
}
u--;
}
return ret;
}
void dfs(int nowlen,int li) {
if(nowlen>ans) ans=nowlen;
w[li].c++;
for(int i=0,j; i<n; i++) {
if(w[i].c>=2) continue;
j=check(li,i);
if(j!=-1 && j!=0) {
dfs(nowlen+j,i);
w[i].c--;
}
}
}
void mem() {
for(int i=0; i<n; i++) w[i].emm();
}
int main() {
scanf("%d",&n);
for(int i=0,lena; i<n; i++) {
cin>>a;
lena=a.length();
w[i].v=a;
w[i].len=lena;
lena--;
w[i].first=a[0]-'a';
}
sort(w,w+n);
cin>>op;
s=op-'a';
for(int i=0; i<n; i++)
if(w[i].first==s) {
mem();
dfs(w[i].len,i);
}
printf("%d",ans);
return 0;
}
2.P1162 填涂颜色
思路(〃'▽'〃)
围一圈0,然后从(0,0)开始进行bfs或者是dfs
代码酱٩(๑❛ᴗ❛๑)۶
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int n;
int map[33][33];
int dx[4] = {0, 0,1,-1},
dy[4] = {1,-1,0, 0};
struct g {
int x,y;
} u,v;
void bfs(int lx,int ly) {
queue<g>q;
u.x=lx,u.y=ly;
map[lx][ly]=3;
q.push(u);
while(!q.empty()) {
u=q.front();
q.pop();
int x=u.x,y=u.y;
for(int i=0,xx,yy; i<4; i++) {
xx=x+dx[i],yy=y+dy[i];
if(xx<0 || xx>n+1 || yy<0 || yy>n+1 || map[xx][yy]==3) continue;
if(map[xx][yy]==0) {
map[xx][yy]=3;
v.x=xx,v.y=yy;
q.push(v);
}
}
}
}
void dfs(int x,int y) {
for(int i=0; i<4; i++) {
int xx=x+dx[i],yy=y+dy[i];
if(xx<0 || xx>n+1 || yy<0 || yy>n+1 || map[xx][yy]==3) continue;
if(map[xx][yy]==0) {
map[xx][yy]=3;
dfs(xx,yy);
}
}
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d",&map[i][j]);
for(int i=0; i<=n+1; i++) //手动围一圈0
map[i][0]=map[0][i]=map[n+1][i]=map[i][n+1]=0;
bfs(0,0);
// dfs(0,0);
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(map[i][j]==3) printf("0 ");
if(map[i][j]==0) printf("2 ");
if(map[i][j]==1) printf("1 ");
}
printf("\n");
}
return 0;
}
3.P1767 家族_NOI导刊2010普及(10)
坑点(;д;)
这读入。。。不想说话
代码酱( • ̀ω•́ )✧
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 110;
const int L = 233;
int n,lens,ans;
int map[N][L],vis[N][L];
string s;
int dx[4]= {0, 0,1,-1},
dy[4]= {1,-1,0, 0};
struct A {
int x,y;
};
void bfs(int lx,int ly) {
queue<A>q;
A u,v;
u.x=lx,u.y=ly;
q.push(u);
while(!q.empty()) {
u=q.front();q.pop();
int x=u.x,y=u.y;
for(int i=0; i<4; i++) {
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<n && ny>=0 && ny<lens && map[nx][ny] && !vis[nx][ny]) {
vis[nx][ny]=1;
v.x=nx,v.y=ny;
q.push(v);
}
}
}
ans++;
}
int main() {
scanf("%d",&n);getline(cin,s);
for(int i=0,len; i<n; i++) {
getline(cin,s);
len=s.length();
lens=max(lens,len);
for(int j=0; j<len; j++)
if('a'<=s[j] && s[j]<='z')
map[i][j]=1;
}
for(int i=0; i<n; i++)
for(int j=0; j<lens; j++)
if(!vis[i][j] && map[i][j])
bfs(i,j);
printf("%d",ans);
return 0;
}
4.P2666 Bessie的秘密牧场
直通
坑点(。・・)ノ
这题目我一开始读错了,然后就光荣爆零了。。。题目真是很重要。。。
代码酱= ̄ω ̄=
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n,v,ans,now;
int f[110];
void dfs(int step) {
if(now>n) return ;
if(step==4) {
if(now==n)
ans++;
return;
}
else {
for(int i=0; i<=v; i++) {
now+=f[i];
dfs(step+1);
now-=f[i];
}
}
}
int main() {
scanf("%d",&n);
v=sqrt(n);
for(int i=0; i<=v; i++) f[i]=i*i;
dfs(0);
printf("%d",ans);
return 0;
}
5.P2689 东南西北
坑点○| ̄|_
注意它读入的方向,栽了。。。(虽然是入门题哈哈哈)
代码酱╭( ・ㅂ・)و ̑̑
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#define INF 5201314
using namespace std;
const int M = 1010;
int T,top,ans=INF,sx,sy,ex,ey;
int v[M];
int dx[4] = {0,-1,0,1},
dy[4] = {1,0,-1,0};
bool vis[M][M];
void dfs(int x,int y,int t,int s) {
if(t>T) return ;
if(x==ex && y==ey) {
ans=min(ans,s);
return ;
}
int f,nx,ny;
f=v[t];
nx=x+dx[f],ny=y+dy[f];
if(nx>0 && nx<=T && ny>0 && ny<=T && !vis[nx][ny]) {
vis[nx][ny]=true;
dfs(nx,ny,t+1,s+1);
vis[nx][ny]=false;
}
dfs(x,y,t+1,s);
}
int main() {
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
scanf("%d",&T);
for(int i=1; i<=T; i++) {
char a;
cin>>a;
top++;
switch (a) {
case 'E': v[top]=0; break;
case 'S': v[top]=1; break;
case 'W': v[top]=2; break;
case 'N': v[top]=3; break;
}
}
dfs(sx,sy,1,0);
if(ans==INF) printf("-1");
else printf("%d",ans);
return 0;
}