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(晚上再写

 

===================================分割线===================================

 

POJ - 1426

 
#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;
}

 

===================================分割线===================================

 

POJ - 3126

#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;
}
View Code

 

 

===================================分割线===================================

Shuffle'm Up

 POJ - 3087 

#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;
}

 

posted @ 2020-02-02 12:57  Tabshh  阅读(113)  评论(0)    收藏  举报