/*
作者:桦清_L
题目:p1004 四子连棋
*/
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <math.h>
using namespace std;
#define inf 1000000000
int ans;
char map[5][5];
bool can(int x, int y, char c) //判断是否越界和避免与另一个空格交换
{
return (x >= 1 && x <= 4 && y >= 1 && y <= 4 && map[x][y] != c);
}
bool check() //判断 横竖 斜反斜是否连
{
for (int i = 1; i <= 4; i++)
{
if (map[i][1] == map[i][2] && map[i][1] == map[i][3] && map[i][1] == map[i][4]) return 1; //行
if (map[1][i] == map[2][i] && map[1][i] == map[3][i] && map[1][i] == map[4][i]) return 1; //列
}
if (map[1][1] == map[2][2] && map[1][1] == map[3][3] && map[1][1] == map[4][4]) return 1; //正斜
if (map[1][4] == map[2][3] && map[1][4] == map[3][2] && map[1][4] == map[4][1]) return 1; //反斜
return 0;
}
int dfs(int x1, int y1, int x2, int y2, char c, int step)
{
int move[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };
if (step == ans) //弹出条件
{
if (check()) return 1;
else return 0;
}
for (int i = 0; i < 4; i++) //四个方向
{
int nx1 = x1 + move[i][0];
int ny1 = y1 + move[i][1];
int nx2 = x2 + move[i][0];
int ny2 = y2 + move[i][1];
if (can(nx1, ny1, c))
{
swap(map[x1][y1], map[nx1][ny1]);
if (dfs(nx1, ny1, x2, y2, c == 'B' ? 'W' : 'B', step + 1)) return 1;
swap(map[x1][y1], map[nx1][ny1]);
}
if (can(nx2, ny2, c))
{
swap(map[x2][y2], map[nx2][ny2]);
if (dfs(x1, y1, nx2, ny2, c == 'B' ? 'W' : 'B', step + 1)) return 1;
swap(map[x2][y2], map[nx2][ny2]);
}
}
return 0;
}
code[vs]1004四子连棋(迭代深度优先搜索)
本文介绍了一种解决四子连棋问题的方法,利用迭代深度优先搜索(DFS)来判断是否存在获胜的棋局。代码中定义了判断位置合法、检查连珠状态以及DFS核心函数等功能,旨在寻找游戏的获胜步数。
摘要由CSDN通过智能技术生成