20160319 CodeVs 1073 家族,2033 邮票,1026 逃跑的拉尔夫

来源:互联网 发布:树洞软件 编辑:程序博客网 时间:2024/05/22 12:05

 1073 家族

#include<cstdio>using namespace std;int anc[5005];int _find(int x){    if(anc[x]!=x)        anc[x]=_find(anc[x]);    return anc[x];}int main(){    int n,m,p,a,b;    scanf("%d%d%d",&n,&m,&p);    for(int i=1;i<=n;i++)anc[i]=i;    for(int i=0;i<m;i++){        scanf("%d%d",&a,&b);        a=_find(a);        b=_find(b);        anc[b]=a;    }    for(int i=0;i<p;i++){        scanf("%d%d",&a,&b);        a=_find(a);        b=_find(b);        if(a==b)printf("Yes\n");        else printf("No\n");    }    return 0;}/*基础的并查集一道*/


2033 邮票

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int dp[20000009];int a[55];int main(){    int k,n,maxv=-1;    memset(dp,127,sizeof(dp));    scanf("%d%d",&k,&n);    for(int i=0;i<n;i++){        scanf("%d",a+i);        dp[a[i]]=1;        maxv=max(maxv,a[i]);    }    maxv*=k;    for(int i=1;i<=maxv;i++){        for(int j=0;j<n;j++)            dp[i+a[j]]=min(dp[i]+1,dp[i+a[j]]);        if(dp[i]>k){            maxv=i-1;            break;        }    }    printf("%d\n",maxv);    return 0;}/*dp[i]代表用邮票贴出i的使用张数*/

1026 逃跑的拉尔夫

#include<cstdio>using namespace std;char g[55][55],dir[1005];char v[1005][55][55];int ap=0,ok,x,y,R,C,m;struct Point{    int x,y;}a[3000];void dfs(int k,int i,int j){    if(v[k][i][j]){        if(v[k][i][j]==2)ok=1;        return ;    }    if(ok)return ;    //printf("(%d,%d)\n",i,j);    if(i==x&&j==y&&k<0){        ok=1;        v[k][i][j]=2;        return;    }    if(k<0)return;    switch(dir[k]){        case 'S':for(int c=i-1;c>0&&g[c][j]!='X';c--)dfs(k-1,c,j);break;        case 'N':for(int c=i+1;c<=R&&g[c][j]!='X';c++)dfs(k-1,c,j);break;        case 'E':for(int c=j-1;c>0&&g[i][c]!='X';c--)dfs(k-1,i,c);break;        case 'W':for(int c=j+1;c<=C&&g[i][c]!='X';c++)dfs(k-1,i,c);break;    }    if(ok)v[k][i][j]=2;    else v[k][i][j]=1;}int main(){    char s[10];    scanf("%d%d",&R,&C);    for(int i=1;i<=R;i++){        scanf("%s",g[i]+1);        for(int j=1;j<=C;j++){            if(g[i][j]=='*'){x=i;y=j;}            if(g[i][j]=='.'||g[i][j]=='*'){a[ap].x=i;a[ap].y=j;++ap;}        }    }    scanf("%d",&m);    for(int i=0;i<m;i++){        scanf("%s",s);        dir[i]=s[0];    }    g[x][y]='.';    for(int i=0;i<ap;i++){        ok=0;        dfs(m-1,a[i].x,a[i].y);        if(ok)g[a[i].x][a[i].y]='*';    }    for(int i=1;i<=R;i++){        for(int j=1;j<=C;j++)            printf("%c",g[i][j]);        printf("\n");    }    return 0;}/*记录下所有可达点,逆着从某个空点深搜到起点...这样对于50x50的图太慢了,记忆一下:v[k][i][j]表示逆着走第k个方向的时候在ij位置的搜索结果*/

Finished!

0 0
原创粉丝点击