前言
我搜索超级辣鸡的qaq,都是胡乱搜,各种回溯...
有的时候都能多会回一遍,减成负的(蠢死了)
1.P1019 单词接龙
直通
思路_(:з」∠)_
爆搜。。。不想说话。。。
坑点o_O
①我回溯写错了qaq
②改变的长度求成了一共的长度,加多了qaq
代码酱=u=
#include#include 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#include #include 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 ) ) { 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 ) w[i].emm(); } int main() { scanf("%d",&n); for(int i=0,lena; 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 ) if(w[i].first==s) { mem(); dfs(w[i].len,i); } printf("%d",ans); return 0; }
2.P1162 填涂颜色
直通
思路(〃'▽'〃)
围一圈0,然后从(0,0)开始进行bfs或者是dfs
代码酱٩(๑❛ᴗ❛๑)۶
#include
#include
#include
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) {
queueq;
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)
直通
坑点(;д;)
这读入。。。不想说话
代码酱( • ̀ω•́ )✧
#include#include =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#include #include 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) { queueq; 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 =0 && ny vis[nx][ny]) { vis[nx][ny] ) { getline(cin,s); len=s.length(); lens=max(lens,len); for(int j=0; j ) if('a'<=s[j] && s[j]<='z') map[i][j]=1; } for(int i=0; i ) for(int j=0; j ) if(!vis[i][j] && map[i][j]) bfs(i,j); printf("%d",ans); return 0; }
4.P2666 Bessie的秘密牧场
直通
坑点(。・・)ノ
这题目我一开始读错了,然后就光荣爆零了。。。题目真是很重要。。。
代码酱= ̄ω ̄=
#include
#include
#include
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 东南西北
直通
坑点○| ̄|_
注意它读入的方向,栽了。。。(虽然是入门题哈哈哈)
代码酱╭( ・ㅂ・)و ̑̑
#include
#include
#include
#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;
}