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\n",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\n",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\n",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\n",dfs(0,0));
    }
    return 0;
}
View Code

 

posted @ 2017-09-17 20:14  myhappinessisall  阅读(108)  评论(0编辑  收藏  举报