您的位置:首页 > 其它

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

2017-10-09 18:40 218 查看
/*
作者:桦清_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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: