20200202 POJ - 3126 Prime Path POJ - 1426 Find The Multiple POJ - 3087 Shuffle'm Up
>>>>>>>>>POJ 1426直达🚗
>>>>>>>>>POJ 3126直达🚗
>>>>>>>>>POJ 3087直达🚗
做了这么几道搜索题,感觉差不多也摸出了门路,模板差不多记下来了,只是面对不同的题目算法不同罢了
简单写一下想法,
1.搞明白搜索的主题到底是什么(之前的mutiple那题,一开始就没想明白到底搜谁,就没想到算法
2.一般来说,不管是深搜还是广搜,走过的地方都要进行标记
3.如果死循环了,一般都是搜索错了(惨痛经历
TBC(晚上再写
===================================分割线===================================
#include <iostream> #include <cstring> #include <queue> #include <math.h> #include <map> #include<cstring> #include<cstdio> #include<algorithm> #define RG register int #define rep(i,a,b) for(RG i=a;i<=b;++i) #define per(i,a,b) for(RG i=a;i>=b;--i) #define ll long long #define inf (1<<29) using namespace std; const int maxn=20; int a[maxn][maxn],o[maxn][maxn],out[maxn][maxn],path[maxn][maxn],mins=1e9; //int line[10][10],row[10][10],block[10][10]; int n,m,flag,coun; struct point{int l,x,y;}; typedef pair<point,int>p; int dx[]={0,0,-1,1}; int dy[]={1,-1,0,0}; point now,newo,ende; queue<p> qu; 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; } inline void clean(){ memset(a,0,sizeof(a)); memset(out,0,sizeof(out)); } void print(){ return; } void dfs(ll p,int q){ if(flag){ if(q<=19 && p%n==0){flag=0;cout<<p<<endl;} if(q>19)return; dfs(p*10,q+1); dfs(p*10+1,q+1); } } int main() { while(cin>>n && n){ flag=1; dfs(1,1); } return 0; }
===================================分割线===================================
#include <iostream> #include <cstring> #include <queue> #include <math.h> #include <map> #include<cstring> #include<cstdio> #include<algorithm> #define RG register int #define rep(i,a,b) for(RG i=a;i<=b;++i) #define per(i,a,b) for(RG i=a;i>=b;--i) #define ll long long #define inf (1<<29) using namespace std; const int maxn=1e5+5; int a[maxn],vis[maxn],mins=1e9; int n,flag,coun; struct point{int x,y;}; typedef pair<point,int>p; int dx[]={0,0,-1,1}; int dy[]={1,-1,0,0}; point num,now; queue<p> qu; 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; } inline void clean(){ queue<p> empty; swap(empty,qu); memset(vis,0,sizeof(vis)); } int judge(int n){ double p=sqrt(n); rep(i,2,p)if(n%i==0){return 0;} return 1; } void find_prime(){ rep(i,1000,9999) if(judge(i)){a[i]=1;} else a[i]=0; } void print(){ rep(i,1000,9999)if(a[i])cout<<i<<endl; } int judge_num(int n,int m){ if(n==m)return 0; if(n<m){int t=m;m=n;n=t;} if(n-m>999){if((n-m)%1000==0)return 1;} else if(n-m>99){if(n/1000==m/1000 && (n-m)%100==0)return 1;} else if(n-m>9){if((n-m)%10==0 && n/100==m/100)return 1;} else if(n/10==m/10)return 1; return 0; } void bfs(){ while(!qu.empty()) { int flag=0; num=qu.front().first; int dis=qu.front().second; //cout<<"now: "<<num.x<<"dis: "<<dis<<endl; if(num.x==num.y){cout<<dis<<endl;break;} now.y=num.y; qu.pop(); rep(i,1000,9999) { if(a[i] && !vis[i] && judge_num(num.x,i)) { now.x=i; if(i==num.y){flag=1;break;} vis[i]=1; //cout<<i<<endl; qu.push(p(now,dis+1)); } } if(flag){cout<<dis+1<<endl;break;} } } int main() { n=read(); find_prime(); while(n--) { num.x=read(),num.y=read(); qu.push(p(num,0)); bfs(); clean(); } return 0; }
优化judge
inline int judge(int x,int y)
{
int sum=0;
while(x) {if(x%10!=y%10) sum++;x/=10,y/=10;}
return sum==1;
}
最短路解法
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define RG register int #define rep(i,a,b) for(RG i=a;i<=b;++i) #define per(i,a,b) for(RG i=a;i>=b;--i) #define ll long long #define inf (1<<29) #define maxn 10005 #define lim 10002 #define maxm 1500005 #define add(x,y) e[++ct]=(E){y,head[x]},head[x]=ct using namespace std; int n,m,cnt,ct; int isp[maxn],p[maxn],head[maxn],dis[maxn],vis[maxn],id[maxn]; struct E{ int v,next; }e[maxm]; 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; } inline int judge(int x,int y) { int sum=0; while(x) {if(x%10!=y%10) sum++;x/=10,y/=10;} return sum==1; } void pre() { rep(i,2,lim) { if(!isp[i]) p[++cnt]=i,id[i]=cnt; for(RG j=1;j<=cnt&&p[j]*i<=lim;j++) { isp[i*p[j]]=1; if(!(i%p[j])) break; } } rep(i,169,cnt) rep(j,i+1,cnt) if(judge(p[i],p[j])) add(i,j),add(j,i); } int SPFA(int S,int T) { memset(dis,63,sizeof(dis));dis[S]=0; queue<int> que;que.push(S); RG u,v; while(!que.empty()) { u=que.front(),que.pop(),vis[u]=0; for(RG i=head[u];i;i=e[i].next) { v=e[i].v; if(dis[v]>dis[u]+1){ dis[v]=dis[u]+1; if(!vis[v]) vis[v]=1,que.push(v); } } } return dis[T]; } int main() { int Tim=read(); pre(); while(Tim--) { scanf("%d%d",&n,&m); printf("%d\n",SPFA(id[n],id[m])); } return 0; }
===================================分割线===================================
Shuffle'm Up
#include <iostream> #include <cstring> #include <queue> #include <math.h> #include <map> #include<cstring> #include<cstdio> #include<string> #include<algorithm> #define RG register int #define rep(i,a,b) for(RG i=a;i<=b;++i) #define per(i,a,b) for(RG i=a;i>=b;--i) #define ll long long #define inf (1<<29) using namespace std; const int maxn=100+5; int a[maxn],b[maxn],po[205],mins=1e9; int n,N,flag,coun=0; struct point{int x,y;}; typedef pair<string,int>p; int dx[]={0,0,-1,1}; int dy[]={1,-1,0,0}; point num,now; string str1,str2,ans; queue<p> qu; map<string,int> vis; 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; } inline void clean(){ queue<p> emptyqu; swap(emptyqu,qu); vis.clear(); //memset(vis,0,sizeof(vis)); } void bfs(){ while(!qu.empty()) { string str=qu.front().first; int oper=qu.front().second; qu.pop(); if(str==ans){cout<<++coun<<" "<<oper<<endl;break;} str1=str.substr(0,n);str2=str.substr(n,n); //cout<<str<<" "<<str1<<" "<<str2<<" "<<endl; string resul=""; rep(i,0,n-1) { resul.push_back(str2[i]); resul.push_back(str1[i]); //cout<<str2[i]<<" "<<str1[i]<<" "<<resul<<endl; } map<string,int>::iterator it=vis.find(resul); if(it==vis.end()){ vis[resul]=1; qu.push(p(resul,oper+1)); } else{ cout<<++coun<<" -1"<<endl; break; } } } int main() { N=read(); while(N--) { string resul=""; n=read(); cin>>str1>>str2>>ans; rep(i,0,n-1) { resul.push_back(str2[i]); resul.push_back(str1[i]); //cout<<str2[i]<<" "<<str1[i]<<" "<<resul<<endl; } //cout<<resul<<" "<<str1<<" "<<str2<<" "<<endl; vis[resul]=1; qu.push(p(resul,1)); bfs(); clean(); } return 0; }

浙公网安备 33010602011771号