poj 3317 Stake Your Claim 极大极小搜索
思路:为了方便,当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 极大极小搜索的更多相关文章
- poj 1568 Find the Winning Move 极大极小搜索
思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...
- POJ 1568 极大极小搜索 + alpha-beta剪枝
极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的. 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了..瞬间吐血! ps. 据说加一句 if sum & ...
- 算法笔记--极大极小搜索及alpha-beta剪枝
参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- [CodeVs3196]黄金宝藏(DP/极大极小搜索)
题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数. 显然这种类型的博弈题,第一眼就是极大极小搜索+记 ...
- POJ 1568 Find the Winning Move(极大极小搜索)
题目链接:http://poj.org/problem?id=1568 题意:给出一个4*4的棋盘,x和o两人轮流放.先放够连续四个的赢.给定一个局面,下一个轮到x放.问x是否有必胜策略?若有,输出能 ...
- POJ 1088 滑雪(记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92384 Accepted: 34948 Description ...
- POJ - 1426 Find The Multiple(搜索+数论)
转载自:優YoU http://user.qzone.qq.com/289065406/blog/1303946967 以下内容属于以上这位dalao http://poj.org/problem? ...
- POJ 3009 Curling 2.0 {深度优先搜索}
原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...
随机推荐
- Android 创建单例模式的几种方法
java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式 ...
- 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 ...
- Java之蛋疼的file Protocol
file Protocol Opens a file on a local or network drive. Syntax file:///sDrives[|sFile] Tokens sDrive ...
- 六大Nagios常见问题解决办法
Nagios常见问题1: It appears as though you do not have permission to view information for any of the host ...
- 42.JTAG接口使用注意
无论是客户反馈,还是自己亲身经历,USB-Blaster不能下载配置FPGA的情况时有出现.究其原因,大致有如下几条: 1. FPGA器件上的JTAG相关引脚出现故障: 2. USB-Blaster坏 ...
- mysql卸载注意事项
由于数据库软件十分的复杂,不管是Mysql还是sqlserver安装都有很多配置要选择. 假若你第一次安装数据库失败,然后又想卸载,又再次安装,这时可能由于你第一次的卸载不完全,会导致你第二次安装时出 ...
- SQL Server 2008 的安装
SQL Server 2008简体中文企业版下载(SQL2008) SQL Server 2008分为SQL Server 2008企业版.标准版.工作组版.Web版.开发者版.Express版.Co ...
- Ajaxadr ajax跨域请求crossdomain
最近工作需要用到ajax跨域请求参数,网上找很很久,最终得到解决之道.分享一下吧,希望能帮到各位 也许你已经发现在浏览器直接敲路径能获得对方提供接口的参数,而一到项目中Ajax请求却老是失败.原因是, ...
- c++中的virtual函数,即虚函数
c++中的虚函数主要是用来实现多态的,虽然都同时指向父类的实例.但调用的确实子类的函数,这个有点像java的接口和实现的关系了.一个接口有多种实现,一个接口对象调用的是哪个实现的方法,这个就是多态了 ...
- 软件工程实践小队--团队项目NABC
团队项目的NABC 1) N (Need 需求) 作为一个网上教学问答系统,用户的基本需求很明确,即为:提问.搜索.浏览.回答.编辑.评论.附加需求还有: 获取金币.提升等级. 提问:关于一门学科,用 ...