华容道
来源:互联网 发布:淘宝爆款平台 编辑:程序博客网 时间: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;
}
#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;
}
阅读全文