思路:为了方便,当c1>c2时将0变为1,1变为0.

空格最多有10个,每个空格有3个状态,如果不状态压缩,会TLE的。所以最多有3^10种情况

代码如下:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#define inf 1<<30
using namespace std;
struct point
{
int x,y;
point(){}
point(int _x,int _y):x(_x),y(_y){}
}pos[],s;
int move[][]={{-,},{,},{,-},{,}};
char str[][];
int x,y,n,sum,ret,dp[],p[];
map<int ,int>mm;
bool vis[][];
void dfs(int x,int y)
{
if(vis[x][y]) return ;
vis[x][y]=;
sum++;
for(int i=;i<;i++){
int a=x+move[i][];
int b=y+move[i][];
if(a>=&&a<n&&b>=&&b<n&&!vis[a][b]&&str[x][y]==str[a][b])
dfs(a,b);
}
}
int get_score()
{
memset(vis,,sizeof(vis));
int t1=,t2=;
for(int i=;i<n;i++)
for(int j=;j<n;j++){
if(!vis[i][j]){
sum=;
dfs(i,j);
if(str[i][j]=='') 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]='';
int t=minimax(state-k,now+p[j],d+,ma);
str[pos[j].x][pos[j].y]='.';
ma=max(ma,t);
if(ma>=mi) return ma;
if(d==){ //更新结果
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]='';
int t=maxmini(state-k,now+*p[j],d+,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[]=;
for(int i=;i<=;i++) p[i]=*p[i-];
for(int i=;i<=;i++) mm[(<<i)]=i;
while(scanf("%d",&n)&&n){
int c1=,c2=,num=;
for(int i=;i<n;i++){
scanf("%s",str[i]);
for(int j=;j<n;j++){
if(str[i][j]=='') c1++;
else if(str[i][j]=='') c2++;
else pos[num++]=point(i,j);
}
}
if(c1>c2){ //始终让0先走
for(int i=;i<n;i++)
for(int j=;j<n;j++){
if(str[i][j]=='') str[i][j]='';
else if(str[i][j]=='') str[i][j]='';
}
}
for(int i=;i<p[num];i++) dp[i]=-inf;
ret=-inf;
maxmini((<<num)-,,,inf);
printf("(%d,%d) %d\n",s.x,s.y,ret);
}
return ;
}

poj 3317 Stake Your Claim 极大极小搜索的更多相关文章

  1. poj 1568 Find the Winning Move 极大极小搜索

    思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...

  2. POJ 1568 极大极小搜索 + alpha-beta剪枝

    极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的. 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了..瞬间吐血! ps. 据说加一句 if sum & ...

  3. 算法笔记--极大极小搜索及alpha-beta剪枝

    参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...

  4. 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】

    极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...

  5. [CodeVs3196]黄金宝藏(DP/极大极小搜索)

    题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数. 显然这种类型的博弈题,第一眼就是极大极小搜索+记 ...

  6. POJ 1568 Find the Winning Move(极大极小搜索)

    题目链接:http://poj.org/problem?id=1568 题意:给出一个4*4的棋盘,x和o两人轮流放.先放够连续四个的赢.给定一个局面,下一个轮到x放.问x是否有必胜策略?若有,输出能 ...

  7. POJ 1088 滑雪(记忆化搜索)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 92384   Accepted: 34948 Description ...

  8. POJ - 1426 Find The Multiple(搜索+数论)

    转载自:優YoU  http://user.qzone.qq.com/289065406/blog/1303946967 以下内容属于以上这位dalao http://poj.org/problem? ...

  9. POJ 3009 Curling 2.0 {深度优先搜索}

    原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...

随机推荐

  1. Android--ViewPager的无限轮播

    ViewPage_RadioButton实现带小圆点的无限轮播,效果还能凑合着用. 1.在ViewPage的监听里面这样处理 @Override public void onPageSelected( ...

  2. A taste of urllib3

    import urllib3 import certifi http = urllib3.PoolManager( cert_reqs='CERT_REQUIRED', # Force certifi ...

  3. 关于 Google Chrome 中的全屏模式和 APP 模式

    前言:我一直在纠结这篇文章是否应该归类在「前段开发」的范围内,哈哈! 前段时间做了一个项目,涉及到一个要全屏模式去访问网页的需求,因为 Google Chrome 的效率不错,而且专门为 Chrome ...

  4. 搭建SpringMVC+MyBatis开发框架四

    在src/main下面新建一个resouces文件夹,我们继续配置一些资源 1.新增applicationContext.xml:  <?xml version="1.0" ...

  5. Java令牌生成器

    package Token; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; im ...

  6. EF:Invalid column name 'Discriminator'.

    错误信息: InnerException: System.Data.SqlClient.SqlExceptionHResult=-2146232060Message=Invalid column na ...

  7. 03.RedisJava客户端Jedis的使用

    1.Jedis基本使用 使用Jedis客户端使用Redis服务与在服务器上通过redis-cli使用命令基本一样,关于Redis命令请参考:http://www.redis.cn/commands.h ...

  8. Codeforce 438D-The Child and Sequence 分类: Brush Mode 2014-10-06 20:20 102人阅读 评论(0) 收藏

    D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input st ...

  9. 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。

    编译程序的时候出现这样的错误,原因是在新建MFC项目的时候,设置字符集Unicode的属性. 解决方法一: 在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点 ...

  10. 研究Dropbox Server端文件系统

    一.传统文件系统 可以理解成两部分:1.真正的storage区,被分割成n个扇区:2.文件系统,其实就是一个FAT表. 二.Dropbox的文件系统 例如,一个modeo.mov的文件,大小为15M. ...