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--ViewPager的无限轮播
ViewPage_RadioButton实现带小圆点的无限轮播,效果还能凑合着用. 1.在ViewPage的监听里面这样处理 @Override public void onPageSelected( ...
- A taste of urllib3
import urllib3 import certifi http = urllib3.PoolManager( cert_reqs='CERT_REQUIRED', # Force certifi ...
- 关于 Google Chrome 中的全屏模式和 APP 模式
前言:我一直在纠结这篇文章是否应该归类在「前段开发」的范围内,哈哈! 前段时间做了一个项目,涉及到一个要全屏模式去访问网页的需求,因为 Google Chrome 的效率不错,而且专门为 Chrome ...
- 搭建SpringMVC+MyBatis开发框架四
在src/main下面新建一个resouces文件夹,我们继续配置一些资源 1.新增applicationContext.xml:  <?xml version="1.0" ...
- Java令牌生成器
package Token; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; im ...
- EF:Invalid column name 'Discriminator'.
错误信息: InnerException: System.Data.SqlClient.SqlExceptionHResult=-2146232060Message=Invalid column na ...
- 03.RedisJava客户端Jedis的使用
1.Jedis基本使用 使用Jedis客户端使用Redis服务与在服务器上通过redis-cli使用命令基本一样,关于Redis命令请参考:http://www.redis.cn/commands.h ...
- 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 ...
- 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。
编译程序的时候出现这样的错误,原因是在新建MFC项目的时候,设置字符集Unicode的属性. 解决方法一: 在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点 ...
- 研究Dropbox Server端文件系统
一.传统文件系统 可以理解成两部分:1.真正的storage区,被分割成n个扇区:2.文件系统,其实就是一个FAT表. 二.Dropbox的文件系统 例如,一个modeo.mov的文件,大小为15M. ...