首页 > 代码库 > POJ 1568 极大极小搜索 + alpha-beta剪枝
POJ 1568 极大极小搜索 + alpha-beta剪枝
极小极大搜索 的个人理解(alpha-beta剪枝)
主要算法依据就是根据极大极小搜索实现的。
苦逼的是,查了两个晚上的错,原来最终是判断函数写错了。。瞬间吐血!
ps. 据说加一句 if sum < 4 printf("#####\n")会变态的快,不过懒得加了
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cstdlib>#include <cmath>#include <utility>#include <vector>#include <queue>#include <set>#define INF 0x3f3f3f3fusing namespace std;int map[4][4], sum, winx, winy;char c;bool check(int otherplayer){ for(int i = 0; i < 4; i ++) { int tmp = 0; for(int j = 0; j < 4; j ++) tmp += (map[i][j] == otherplayer); if(tmp == 4) return 1; } for(int j = 0; j < 4; j ++) { int tmp = 0; for(int i = 0; i < 4; i ++) tmp += (map[i][j] == otherplayer); if(tmp == 4) return 1; } int tmp1 = 0, tmp2 = 0; for(int i = 0; i < 4; i ++) { tmp1 += (map[i][i] == otherplayer); tmp2 += (map[3-i][i] == otherplayer); } if(tmp1 == 4 || tmp2 == 4) return 1; return 0;}int alpha_beta(int depth, int alpha, int beta){ int nowplayer = depth&1; if(check(1-nowplayer)) return -1; if(sum == 16) return 0; for(int i = 0; i < 4; i ++) for(int j = 0; j < 4; j ++) if(map[i][j] == 2) { map[i][j] = nowplayer; sum ++; int tmp = -alpha_beta(depth+1, -beta, -alpha); map[i][j] = 2; sum --; if(tmp >= beta) return beta; if(tmp > alpha) alpha = tmp; if(depth == 0 && alpha == 1) { winx = i, winy = j; return alpha; } } return alpha;}int main(){ while(getchar() != ‘$‘) { sum = 0; getchar(); for(int i = 0; i < 4; i ++) for(int j = 0; j < 4; j ++) { c = getchar(); switch (c){ case ‘.‘: map[i][j] = 2; break; case ‘x‘: map[i][j] = 0; sum ++; break; case ‘o‘: map[i][j] = 1; sum ++; } if(j == 3) getchar(); } if(alpha_beta(0, -INF, INF) == 1) printf("(%d,%d)\n", winx, winy); else printf("#####\n"); } return 0;}/*?.....xo..ox.....?o....ox..xxxxooo?xxxooxox....xxxo$*/
POJ 1568 极大极小搜索 + alpha-beta剪枝
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。