luogu洛谷 p1162 p1019
阿新 • • 發佈:2018-12-13
很久沒做搜尋題了,做了兩道
很明顯的寬搜題。不過不好從要求的搜尋,從邊界搜尋易解。
#include<bits/stdc++.h> using namespace std; int n; int a[40][40]; int x[]={0,0,1,-1}; int y[]={1,-1,0,0}; void bfs(int i,int j){ a[i][j]=-1; queue<pair<int,int> > q; q.push(make_pair(i,j)); pair<int,int> temp; while(!q.empty()){ temp=q.front(); q.pop(); int xx=temp.first,yy=temp.second; // cout<<xx<<' '<<yy<<endl; for(int t=0;t<4;++t){ if(xx+x[t]!=0&&xx+x[t]!=n+1&&yy+y[t]!=0&&yy+y[t]!=n+1&&a[xx+x[t]][yy+y[t]]==0){ a[xx+x[t]][yy+y[t]]=-1; q.push(make_pair(xx+x[t],yy+y[t]) ); } } } } int main(){ cin>>n; for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ cin>>a[i][j]; } } for(int i=1;i<=n;++i){//遍歷上下左右邊界 if(a[1][i]==0) bfs(1,i); if(a[n][i]==0) bfs(n,i); if(a[i][1]==0) bfs(i,1); if(a[i][n]==0) bfs(i,n); } for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ if(a[i][j]==-1) cout<<0<<' '; if(a[i][j]==1) cout<<1<<' '; if(a[i][j]==0) cout<<2<<' '; } cout<<endl; } return 0; }
首先要預處理一下,然後是深搜加回溯吧
#include<bits/stdc++.h> using namespace std; string s[25]; int countt[25],num[25][25];//countt記錄每個使用次數,num第i個後接第j個最小重合個數 int n,INF=-12345; int ans=-1; int nn=0; int fun(int i,int j){//第i個後面接第j個 int res=0; for(int k=s[i].size()-1;k>=0/*&&k>=s[i].size()-s[j].size()*/;k--){ int t,st=0; for(t=k;t<s[i].size();++t){ if(s[i][t]==s[j][st]&&st!=s[j].size()){ st++; } else break; } if(t>=s[i].size()){ return s[i].size()-k; } } return INF; } void dfs(int p){ bool pd=0; for(int i=0;i<n;++i){ if(countt[i]>=2||num[p][i]==INF||num[p][i]==s[p].size()||num[p][i]==s[i].size()) continue; int len=s[i].size()-num[p][i]; nn+=len; countt[i]++,pd=1; dfs(i); nn-=len,countt[i]--; } if(!pd){ ans=max(ans,nn); } return ; } int main(){ cin>>n; for(int i=0;i<n;++i){ cin>>s[i]; } char start; cin>>start; for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ num[i][j]=fun(i,j); } } // for(int i=0;i<n;++i){ // for(int j=0;j<n;++j){ // cout<<num[i][j]<<' '; // } // cout<<endl; // } for(int i=0;i<n;++i){ if(s[i][0]==start){ countt[i]++; nn=s[i].size(); dfs(i); countt[i]=0; } } cout<<ans<<endl; return 0; }