• 2013 :: 杭州


    A

    状压暴力

    #include <bits/stdc++.h>
    using namespace std;
    typedef pair<int,int> pii;
    const int dx[2][4]={1,-1,-1,1,0,0,0,0};
    const int dy[2][4]={0,0,0,0,1,1,-1,-1};
    const int inf=0x3f3f3f3f;
    int n,m,sz,res,H[205][205];
    vector<pii> vec;
    char s[205][205];
    inline int light(int u,int st,int dir) {
        st|=(1<<u);
        int x=vec[u].first,y=vec[u].second;
        for (int i=0;i<2;++i) {
            int tx=x+dx[i][dir],ty=y+dy[i][dir];
            if (tx<0||tx>=n||ty<0||ty>=m)
                continue;
            if (s[tx][ty]=='#')
                return -1;
            st|=(1<<H[tx][ty]);
        }
        return st;
    }
    void dfs(int u,int st,int now,int cnt) {
        if (st==sz) {
            res=min(res,cnt);
            return;
        }
        if (u==(int)vec.size())
            return;
        if (u==now) {
            for (int i=0;i<4;++i) {
                int nxt=light(u,st,i);
                if (nxt==-1)
                    continue;
                dfs(u+1,nxt,now,cnt+1);
            }
        } else {
            int nxt=light(u,st,1);
            if (nxt!=-1)
                dfs(u+1,nxt,now,cnt+1);
        }
        dfs(u+1,st,now,cnt);
    }
    int main()
    {
        while (scanf("%d%d",&n,&m)==2&&n+m) {
            memset(H,-1,sizeof H);
            for (int i=0;i<n;++i)
                scanf("%s",s[i]);
            vec.clear();
            int cnt=0;
            for (int i=0;i<n;++i)
                for (int j=0;j<m;++j)
                    if (s[i][j]=='.') {
                        vec.push_back(pii(i,j));
                        H[i][j]=cnt++;
                    }
            if (cnt==0) {
                puts("0");
                continue;
            }
            sz=vec.size();
            sz=(1<<sz)-1;
            res=inf;
            for (int i=0;i<(int)vec.size();++i)
                dfs(0,0,i,0);
            printf("%d
    ",res==inf?-1:res);
        }
        return 0;
    }
    View Code

    B

    爆搜图基本和A一样

    #include <bits/stdc++.h>
    using namespace std;
    struct node {
        int x,y,st;
        node(){}
        node(int x,int y,int st):x(x),y(y),st(st){}
    };
    queue<node> que;
    const int maxn=105;
    const int inf=0x3f3f3f3f;
    const int dx[4]={-1,1,0,0};
    const int dy[4]={0,0,-1,1};
    int n,m,t,st,X[5],Y[5],vis[105][105][16];
    char s[105][105];
    inline int bfs(int xx,int yy) {
        while (!que.empty())
            que.pop();
        for (int i=0;i<n;++i)
            for (int j=0;j<m;++j)
                for (int k=0;k<st;++k)
                    vis[i][j][k]=inf;
        int temp=0;
        for (int i=0;i<t;++i)
            if (xx==X[i]&&yy==Y[i])
                temp|=(1<<i);
        vis[xx][yy][temp]=0;
        que.push(node(xx,yy,temp));
        while (!que.empty()) {
            int x=que.front().x,y=que.front().y,now=que.front().st;
            que.pop();
            for (int i=0;i<4;++i) {
                int tx=x+dx[i],ty=y+dy[i],nxt=now;
                if (tx<0||tx>=n||ty<0||ty>=m||s[tx][ty]=='#')
                    continue;
                for (int j=0;j<t;++j)
                    if (tx==X[j]&&ty==Y[j])
                        nxt|=(1<<j);
                if (nxt==(st-1))
                    return vis[x][y][now]+1;
                if (vis[tx][ty][nxt]!=inf)
                    continue;
                vis[tx][ty][nxt]=vis[x][y][now]+1;
                que.push(node(tx,ty,nxt));
            }
        }
        return -1;
    }
    int main()
    {
        while (scanf("%d%d",&n,&m)==2&&n+m!=0) {
            for (int i=0;i<n;++i)
                scanf("%s",s[i]);
            scanf("%d",&t);
            st=1<<t;
            for (int i=0;i<t;++i) {
                scanf("%d%d",&X[i],&Y[i]);
                --X[i],--Y[i];
            }
            for (int i=0;i<n;++i)
                for (int j=0;j<m;++j)
                    if (s[i][j]=='@')
                        printf("%d
    ",bfs(i,j));
        }
        return 0;
    }
    View Code

    C

    #include <bits/stdc++.h>
    using namespace std;
    int n,s1[305][305],s2[305][305],s3[305][305];
    inline int compare() {
        int ret=0;
        for (int i=0;i<n;++i)
            for (int j=0;j<n;++j)
                if (s1[i][j]==s2[i][j])
                    ++ret;
        return ret;
    }
    inline void flip() {
        for (int i=0;i<n;++i)
            for (int j=0;j<n;++j)
                s3[j][n-i-1]=s1[i][j];
        for (int i=0;i<n;++i)
            for (int j=0;j<n;++j)
                s1[i][j]=s3[i][j];
    }
    int main()
    {
        while (scanf("%d",&n)==1&&n!=0) {
            for (int i=0;i<n;++i)
                for (int j=0;j<n;++j)
                    scanf("%d",&s1[i][j]);
            for (int i=0;i<n;++i)
                for (int j=0;j<n;++j)
                    scanf("%d",&s2[i][j]);
            int res=0;
            for (int i=0;i<4;++i) {
                res=max(res,compare());
                flip();
            }
            printf("%d
    ",res);
        }
        return 0;
    }
    View Code

    I

    DP

    #include <bits/stdc++.h>
    using namespace std;
    const int inf=0x3f3f3f3f;
    int g,b,s,bag[50][10],dp[2][1<<21];
    int vec[10];
    int dfs(int u,int st) {
        if (st==(1<<b)-1) {
            return 0;
        }
        int tmp[10];
        if (u==0&&dp[u][st]!=-inf)
            return dp[u][st];
        if (u==1&&dp[u][st]!=inf)
            return dp[u][st];
        int ret=(u==0)?-inf:inf;
        for (int i=0;i<b;++i)
            if (!(st&(1<<i))) {
                for (int j=0;j<g;++j)
                    tmp[j] = vec[j];
    
                for (int j=0;j<g;++j)
                    vec[j]+=bag[i][j];
                int flag=0;
                for (int j=0;j<g;++j)
                    if (vec[j]>=s) {
                        flag+=vec[j]/s;
                        vec[j] %=s;
                    }
                if (!flag) {
                    if (u==0)
                        ret=max(ret,dfs(!u,st|(1<<i)));
                    else
                        ret=min(ret,dfs(!u,st|(1<<i)));
                }
                else {
                    if (u==0)
                        ret=max(ret,dfs(u,st|(1<<i))+flag);
                    else
                        ret=min(ret,dfs(u,st|(1<<i))-flag);
                }
    
                for (int j=0;j<g;++j)
                    vec[j] = tmp[j];
            }
        return dp[u][st]=ret;
    }
    int main()
    {
        while (scanf("%d%d%d",&g,&b,&s)==3&&(g!=0||b!=0||s!=0)) {
            memset(bag,0,sizeof bag);
            memset(vec,0,sizeof(vec));
            for (int i=0;i<b;++i) {
                int n;
                scanf("%d",&n);
                for (int j=0;j<n;++j) {
                    int c;
                    scanf("%d",&c);
                    --c;
                    ++bag[i][c];
                }
            }
            for (int i=0;i<(1<<b);++i) {
                dp[0][i]=-inf;
                dp[1][i]=inf;
            }
            printf("%d
    ",dfs(0,0));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Python3-shutil模块-高级文件操作
    Python3-sys模块-解释器相关参数与函数
    Python3-os模块-操作系统的各种接口
    Python3-算法-冒泡排序
    Python3-re模块-正则表达式
    Python3-算法-递归
    Python3-设计模式-迭代器模式
    Python3-设计模式-装饰器模式
    PTA 7-28 搜索树判断(镜像二叉搜索树的后序遍历)
    PTA 7-26 Windows消息队列(小顶堆+输入优化)
  • 原文地址:https://www.cnblogs.com/myhappinessisall/p/7536917.html
Copyright © 2020-2023  润新知