栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3317 Stake Your Claim

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3317 Stake Your Claim

#include<iostream>#include<stdio.h>#include<algorithm>#include<iomanip>#include<cmath>#include<cstring>#include<vector>#include<map>#define inf 1<<30using namespace std;struct point{    int x,y;    point(){}    point(int _x,int _y):x(_x),y(_y){}}pos[11],s;int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};char str[9][10];int x,y,n,sum,ret,dp[60000],p[15];map<int ,int>mm;bool vis[9][9];void dfs(int x,int y){    if(vis[x][y]) return ;    vis[x][y]=1;    sum++;    for(int i=0;i<4;i++){        int a=x+move[i][0];        int b=y+move[i][1];        if(a>=0&&a<n&&b>=0&&b<n&&!vis[a][b]&&str[x][y]==str[a][b]) dfs(a,b);    }}int get_score(){    memset(vis,0,sizeof(vis));    int t1=0,t2=0;    for(int i=0;i<n;i++)    for(int j=0;j<n;j++){        if(!vis[i][j]){ sum=0; dfs(i,j); if(str[i][j]=='0') t1=max(t1,sum); else t2=max(t2,sum);        }    }    return t1-t2;}int minimax(int ,int ,int ,int);int maxmini(int state,int now,int d,int mi){    if(!state) return get_score();    if(dp[now]!=-inf) return dp[now];    int ma=-inf,st=state,k,j;    while(st){ //枚举所有的1的情况,也就是'.'的情况        k=st&(-st); // 找到st倒数第一个1        j=mm[k]; //1的位置        str[pos[j].x][pos[j].y]='0';        int t=minimax(state-k,now+p[j],d+1,ma);        str[pos[j].x][pos[j].y]='.';        ma=max(ma,t);        if(ma>=mi) return ma;        if(d==0){ //更新结果 if(ret<ma||(ret==ma&&(s.x>pos[j].x||(s.x==pos[j].x&&s.y>pos[j].y)))){     s=pos[j];     ret=ma; }        }        st-=k; //继续枚举下一个1    }    return dp[now]=ma;}int minimax(int state,int now,int d,int ma){    if(!state) return get_score();    if(dp[now]!=-inf) return dp[now];    int mi=inf,k,st=state,j;    while(st){        k=st&(-st);        j=mm[k];        str[pos[j].x][pos[j].y]='1';        int t=maxmini(state-k,now+2*p[j],d+1,mi);        str[pos[j].x][pos[j].y]='.';        mi=min(mi,t);        if(mi<=ma) return mi;        st-=k;    }    return dp[now]=mi;}int main(){//    freopen("1.txt","r",stdin);    p[0]=1;    for(int i=1;i<=10;i++) p[i]=3*p[i-1];    for(int i=0;i<=11;i++) mm[(1<<i)]=i;    while(scanf("%d",&n)&&n){        int c1=0,c2=0,num=0;        for(int i=0;i<n;i++){ scanf("%s",str[i]); for(int j=0;j<n;j++){     if(str[i][j]=='0') c1++;     else if(str[i][j]=='1') c2++;     else pos[num++]=point(i,j); }        }        if(c1>c2){   //始终让0先走 for(int i=0;i<n;i++) for(int j=0;j<n;j++){     if(str[i][j]=='0') str[i][j]='1';     else if(str[i][j]=='1') str[i][j]='0'; }        }        for(int i=0;i<p[num];i++) dp[i]=-inf;        ret=-inf;        maxmini((1<<num)-1,0,0,inf);        printf("(%d,%d) %dn",s.x,s.y,ret);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/377753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号