code[vs]1004四子连棋(迭代深度优先搜索)

本文介绍了一种解决四子连棋问题的方法,利用迭代深度优先搜索(DFS)来判断是否存在获胜的棋局。代码中定义了判断位置合法、检查连珠状态以及DFS核心函数等功能,旨在寻找游戏的获胜步数。
摘要由CSDN通过智能技术生成
/*
作者:桦清_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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值