华容道

来源:互联网 发布:淘宝爆款平台 编辑:程序博客网 时间:2024/04/27 13:41
#include "stdafx.h"
#include<iostream>
#include"set"
#include"stack"
#include"queue"
#include"memory.h"
using namespace std;


struct G
{
char grid[5][4];
char father[5][4];
};
bool operator<(const G&a, const G&b)
{
return memcmp(a.grid[0], b.grid[0], 20) < 0;
}
void Slide(char(*n)[4], char(*o)[4], int i, int j, int h_distance, int w_distance, int height, int width)
{
int p;
for (p = 0; p < height; p++)
{
for (int q = 0; q < width; q++)
{
n[i + p][q + j] = 'B';
}
}
for (p = 0; p < height; p++)
{
for (int q = 0; q < width; q++)
{
n[i + p + h_distance][q + j + w_distance] = o[i + p][i + q];
}
}
}
void GetNextG(G * newg, const G * oldg, int size)
{
memcpy(newg->grid, oldg->grid, size / 2);
memcpy(newg->father, oldg->grid, size / 2);
}
int Move(G&g, int i, int j, G * newg)
{
if (g.grid[i][j] == '0') return 0;
if ((g, g.grid[i][j] == 'C' || g.grid[i][j] == 'H')&&i!=0 &&  g.grid[i - 1][j] == 'B'&&g.grid[i - 1][j + 1] == 'B')
{
 GetNextG(&newg[0], &g, sizeof(G));
 int h = 1;
 if (g.grid[i][j] == 'C') h = 2;
 Slide(newg[0].grid, g.grid, i, j, -1, 0, h, 2);
 return 1;
}
if (g.grid[i][j] == 'C'&&i < 3 && g.grid[i + 2][j] == 'B'&&g.grid[i + 2][j + 1] == 'B'&&g.grid[i + 2][j + 1] == 'B' || g.grid[i][j] == 'H'&&i < 4 && g.grid[i + 1][j] == 'B'&&g.grid[i + 1][j + 1] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
int h = 1;
if (g.grid[i][j] == 'C') h = 2;
Slide(newg[0].grid, g.grid, i, j, 1, 0, h, 2);
return 1;
    }
if ((g.grid[i][j] == 'C' || g.grid[i][j] == 'G') && j != 0 && g.grid[i][j - 1] == 'B'&&g.grid[i + 1][j - 1] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
int w = 1;
if (g.grid[i][j] == 'C')w = 2;
Slide(newg[0].grid, g.grid, i, j, 0, -1, 2, w);
return 1;
}
if (g.grid[i][j] == 'C'&&j < 2 && g.grid[i][j + 2] == 'B'&&g.grid[i + 1][j + 2] == 'B' || g.grid[i][j] == 'G'&&j < 3 && g.grid[i][j + 1] == 'B'&&g.grid[i + 1][j + 1] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
int w = 1;
if (g.grid[i][j] == 'C') w = 2;
return 1;
}
if (g.grid[i][j] == 'H'&&j != 0 && g.grid[i][j - 1] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid, i, j, 0, -1, 1, 2);
int num = 1;
if (j > 1 && g.grid[i][j - 2] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 0, -2, 1, 2);
num++;
}
return num;
}
if (g.grid[i][j] == 'H'&&j < 2 && g.grid[i][j + 2] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid, i, j, 0, 1, 1, 2);
int num = 1;
if (j < 1 && g.grid[i][j + 3] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 0, 2, 1, 2);
num++;
}
return num;
}
//立将上移操作
if (g.grid[i][j] == 'H'&&i != 0 && g.grid[i - 1][j] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid, i, j, -2, 0, 2, 1);
int num = 1;
if (i > 1 && g.grid[i - 2][j] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, -2, 0, 2, 1);
num++;
}
return num;
}
if (g.grid[i][j] == 'G'&&i < 3 && g.grid[i + 2][j] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid, i, j, 1, 0, 2, 1);
int num = 1;
if (i < 2 && g.grid[i + 3][j] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 2, 0, 2, 1);
num++;


}
return num;
}
if (g.grid[i][j] == 'S'&&i != 0 && g.grid[i - 1][j] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid, i, j, -1, 0, 1, 1);
int num = 1;
if (i > 1 && g.grid[i - 2][j] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, -2, 0, 1, 1);
num++;
}
else if (j != 0 && g.grid[i - 1][j - 1] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, -1, -1, 1, 1);
num++;
}
else if (j < 3 && g.grid[i - 1][j + 1] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, -1, 1, 1, 1);
num++;
}
return num;
}
if (g.grid[i][j] == 'S'&&j != 0 && g.grid[i][j - 1] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid, i, j, 0, -1, 1, 1);
int num = 1;
if (i != 0 && g.grid[i - 1][j - 1] == 'B')
{
GetNextG(&newg[1],&g,sizeof(G));
Slide(newg[1].grid, g.grid, i, j, -1, -1, 1, 1);
num++;
}
else if (j > 1 && g.grid[i][j - 2] =='B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 0, -2, 1, 1);
num++;
}
else if (i < 4 && g.grid[i + 1][j - 1] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 1, -1, 1, 1);
num++;
}
return num;


}
if (g.grid[i][j] == 'S'&&i < 4 && g.grid[i + 1][j] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid, i, j, 1, 0, 1, 1);
int num = 1;
if (i < 3 && g.grid[i + 2][j] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 2, 0, 1, 1);
num++;
}
else if (j != 0 && g.grid[i + 1][j - 1] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 1, -1, 1, 1);
num++;
}
else if (j < 3 && g.grid[i + 1][j + 1] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 1, 1, 1, 1);
num++;
}
return num;
}
//兵右移
if (g.grid[i][j] == 'S'&&j < 3 && g.grid[i][j + 1] == 'B')
{
GetNextG(&newg[0], &g, sizeof(G));
Slide(newg[0].grid, g.grid,i,j, 0, 1, 1, 1);
int num = 1;
if (j < 2 && g.grid[i][j + 2] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 0, 2, 1, 1);
num++;
}
else if (i != 0 && g.grid[i - 1][j + 1] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, -1, 1, 1, 1);
num++;
}
else if (i < 4 && g.grid[i + 1][j + 1] == 'B')
{
GetNextG(&newg[1], &g, sizeof(G));
Slide(newg[1].grid, g.grid, i, j, 1, 1, 1, 1);
num++;
}
return num;


}
return 0;


}
void printG(const G&g)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; i < 4; j++)
{
cout << g.grid[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void printResult(G &g, const set<G>&myset)
{
stack<G>mystack;
while (g.father[0][0] != 0)
{
mystack.push(g);
memcpy(g.grid[0], g.father[0], 20);
if (myset.find(g) != myset.end())
{
g = *myset.find(g);
}
else
{
cout << "Error" << endl;
exit(0);
}

}
int k = 1;
while (!mystack.empty())
{
G g = mystack.top();
mystack.pop();
cout << k++ << ":" << endl;
printG(g);
}
cout << "ALL States:" << myset.size() << endl;
}




int main()
{
char s[] =
{
'G','C','0','G',
'0','0','0','0',
'G','H','0','G',
'0','S','S','0',
'S','B','B','S'
};
G g;
memcpy(g.grid[0], s, 20);
g.father[0][0] = 0;
queue<G>myqueue;
set<G>myset;
myqueue.push(g);
myset.insert(g);
while (!myqueue.empty())
{
G current = myqueue.front();
myqueue.pop();
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++)
{
G next[2];
int n = Move(current, i, j, next);
for (int k = 0; k < n; k++)
{
if (next[k].grid[3][1] == 'C')
{
printResult(next[k], myset);
return 0;
}
if (myset.find(next[k]) == myset.end())
{
myqueue.push(next[k]);
myset.insert(next[k]);
}
}
}
}
}
return 0;
}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大气辐射 空间辐射 辐射2修改器 辐射强度 辐射标志 放疗辐射 辐射避难所破解版 辐射避难所online 辐射避难所攻略 日本核辐射化妆品 变压器有辐射吗 变电站有辐射吗 冰箱有辐射吗 路由器有辐射吗 核辐射的危害 辐射4开局必须七件事 辐射4材料代码 电热毯有辐射吗 辐射什么意思 打印机有辐射吗 打印机有辐射 手机辐射的危害 手机辐射有多大 辐射岛安卓汉化下载 辐射 黑袍雷斯林 辐射对人有什么危害 电脑辐射的危害 电脑辐射有多大 辐射有什么危害 辐射是什么意思 电磁辐射测量仪价格 核辐射检测仪 辐射避难所汉化版 核辐射探测器 便携式核辐射检测仪 核辐射测试仪 辐射安全许可证 核辐射检测仪多少钱 瓷砖辐射检测仪 脸上有辐射斑怎么办 电脑辐射会长斑吗