前言
我搜索超级辣鸡的qaq,都是胡乱搜,各种回溯...
有的时候都能多会回一遍,减成负的(蠢死了)
1.P1019 单词接龙
思路_(:з」∠)_
爆搜。。。不想说话。。。
坑点o_O
①我回溯写错了qaq
②改变的长度求成了一共的长度,加多了qaq
代码酱=u=
#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
代码酱٩(๑❛ᴗ❛๑)۶
#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)
坑点(;д;)
这读入。。。不想说话
代码酱( • ̀ω•́ )✧
#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的秘密牧场
坑点(。・・)ノ
这题目我一开始读错了,然后就光荣爆零了。。。题目真是很重要。。。
代码酱= ̄ω ̄=
#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 东南西北
坑点○| ̄|_
注意它读入的方向,栽了。。。(虽然是入门题哈哈哈)
代码酱╭( ・ㅂ・)و ̑̑
#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; }