#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 10000
#include <cstring>
#include <cstdio>
#define INF 10000
using namespace std;
int bian[18] = { 109,106,98,96,95,87,85,84,74,65,63,54,53,52,42,32,31,21 }, map[18];
int triangle[9][3] = { { 21,32,31 },{ 42,52,54 },{ 53,63,65 },{ 74,84,87 },{ 85,95,98 },{ 96,106,109 } ,{ 84,85,54 } ,{ 53,52,32 },{ 95,96,65 } };
int lu,mark;
void movemap(int head, int end)
{
int i;
mark = 0;
lu = end * 10 + head;
for (i = 0; i < 18; i++)
{
if (lu == bian[i])
{
map[i] = 1;
mark++;
break;
}
}
if(mark==0) printf("傻子,输错了\n");
}
int triangle[9][3] = { { 21,32,31 },{ 42,52,54 },{ 53,63,65 },{ 74,84,87 },{ 85,95,98 },{ 96,106,109 } ,{ 84,85,54 } ,{ 53,52,32 },{ 95,96,65 } };
int lu,mark;
void movemap(int head, int end)
{
int i;
mark = 0;
lu = end * 10 + head;
for (i = 0; i < 18; i++)
{
if (lu == bian[i])
{
map[i] = 1;
mark++;
break;
}
}
if(mark==0) printf("傻子,输错了\n");
}
int NewTriangle()
{
int n = 0;
if (map[15] == 1 && map[16] == 1 && map[17] == 1) n++;
if (map[11] == 1 && map[13] == 1 && map[14] == 1) n++;
if (map[9] == 1 && map[10] == 1 && map[12] == 1) n++;
if (map[5] == 1 && map[7] == 1 && map[8] == 1) n++;
if (map[2] == 1 && map[4] == 1 && map[6] == 1) n++;
if (map[3] == 1 && map[0] == 1 && map[1] == 1) n++;
if (map[6] == 1 && map[7] == 1 && map[11] == 1) n++;
if (map[12] == 1 && map[13] == 1 && map[15] == 1) n++;
if (map[3] == 1 && map[4] == 1 && map[9] == 1) n++;
return n;
}
{
int n = 0;
if (map[15] == 1 && map[16] == 1 && map[17] == 1) n++;
if (map[11] == 1 && map[13] == 1 && map[14] == 1) n++;
if (map[9] == 1 && map[10] == 1 && map[12] == 1) n++;
if (map[5] == 1 && map[7] == 1 && map[8] == 1) n++;
if (map[2] == 1 && map[4] == 1 && map[6] == 1) n++;
if (map[3] == 1 && map[0] == 1 && map[1] == 1) n++;
if (map[6] == 1 && map[7] == 1 && map[11] == 1) n++;
if (map[12] == 1 && map[13] == 1 && map[15] == 1) n++;
if (map[3] == 1 && map[4] == 1 && map[9] == 1) n++;
return n;
}
int Alphabeta(int depth,int s, int alpha, int beta, int total, int scoreA, int scoreB)
{
int p = 0;
int hhh = 0, KK = 0, sum;
if (scoreA >= 5 || scoreB >= 5)
return 1;
for (int i = 0; i<18; i++)
{
if (map[i] == 1)
continue;
else map[i] = 1;
int val;
sum = NewTriangle();
KK = sum - total;
if (KK > 0)
{
if (s == 0)
val = Alphabeta(depth+1,s, alpha, beta, sum, scoreA + KK, scoreB);
else
val = Alphabeta(depth+1,s, alpha, beta, sum, scoreA, scoreB + KK);
}
else
{
val = -Alphabeta(depth+1,1 - s, -beta, -alpha, sum, scoreA, scoreB);
}
if (val == 1 && depth == 0)
return i;
map[i] = 0;
if (val > alpha)
alpha = val;
if (val >= beta)
return beta;
}
return alpha;
}
int main()
{
int player = 0, scoreA = 0, scoreB = 0, game = 1, sum,score;
int i, n, head, end, ans, KK;
while (game++)
{
memset(map, 0, sizeof(map));
player = scoreA = scoreB = ans = 0;
sum = 0;
while (scoreA < 5 && scoreB <5)
{
printf("请输入:");
cin >> head >> end;
movemap(head, end);
if (mark == 0)
continue;
KK = NewTriangle() - sum;
k:
if (KK > 0)
{
scoreA += KK;
sum = NewTriangle();
continue;
}
else {
player = 1;
ans = Alphabeta(0, player, -INF, INF, sum, scoreA, scoreB);
head = bian[ans] % 10;
end = bian[ans] / 10;
printf("%d %d\n", head, end);
score = NewTriangle() - sum;
scoreB += score;
sum = NewTriangle();
if (score > 0)
goto k;
}
}
printf("game %d: ", game);
if (scoreA >= 5)
printf("You win!\n");
else printf("你太菜了23333\n");
}
}
player = scoreA = scoreB = ans = 0;
sum = 0;
while (scoreA < 5 && scoreB <5)
{
printf("请输入:");
cin >> head >> end;
movemap(head, end);
if (mark == 0)
continue;
KK = NewTriangle() - sum;
k:
if (KK > 0)
{
scoreA += KK;
sum = NewTriangle();
continue;
}
else {
player = 1;
ans = Alphabeta(0, player, -INF, INF, sum, scoreA, scoreB);
head = bian[ans] % 10;
end = bian[ans] / 10;
printf("%d %d\n", head, end);
score = NewTriangle() - sum;
scoreB += score;
sum = NewTriangle();
if (score > 0)
goto k;
}
}
printf("game %d: ", game);
if (scoreA >= 5)
printf("You win!\n");
else printf("你太菜了23333\n");
}
}