思路:为了方便,当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 创建单例模式的几种方法

    java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式 ...

  2. Tutorial: Importing and analyzing data from a Web Page using Power BI Desktop

    In this tutorial, you will learn how to import a table of data from a Web page and create a report t ...

  3. Java之蛋疼的file Protocol

    file Protocol Opens a file on a local or network drive. Syntax file:///sDrives[|sFile] Tokens sDrive ...

  4. 六大Nagios常见问题解决办法

    Nagios常见问题1: It appears as though you do not have permission to view information for any of the host ...

  5. 42.JTAG接口使用注意

    无论是客户反馈,还是自己亲身经历,USB-Blaster不能下载配置FPGA的情况时有出现.究其原因,大致有如下几条: 1. FPGA器件上的JTAG相关引脚出现故障: 2. USB-Blaster坏 ...

  6. mysql卸载注意事项

    由于数据库软件十分的复杂,不管是Mysql还是sqlserver安装都有很多配置要选择. 假若你第一次安装数据库失败,然后又想卸载,又再次安装,这时可能由于你第一次的卸载不完全,会导致你第二次安装时出 ...

  7. SQL Server 2008 的安装

    SQL Server 2008简体中文企业版下载(SQL2008) SQL Server 2008分为SQL Server 2008企业版.标准版.工作组版.Web版.开发者版.Express版.Co ...

  8. Ajaxadr ajax跨域请求crossdomain

    最近工作需要用到ajax跨域请求参数,网上找很很久,最终得到解决之道.分享一下吧,希望能帮到各位 也许你已经发现在浏览器直接敲路径能获得对方提供接口的参数,而一到项目中Ajax请求却老是失败.原因是, ...

  9. c++中的virtual函数,即虚函数

    c++中的虚函数主要是用来实现多态的,虽然都同时指向父类的实例.但调用的确实子类的函数,这个有点像java的接口和实现的关系了.一个接口有多种实现,一个接口对象调用的是哪个实现的方法,这个就是多态了 ...

  10. 软件工程实践小队--团队项目NABC

    团队项目的NABC 1) N (Need 需求) 作为一个网上教学问答系统,用户的基本需求很明确,即为:提问.搜索.浏览.回答.编辑.评论.附加需求还有: 获取金币.提升等级. 提问:关于一门学科,用 ...