没有什么好的办法,广搜遍历状态树,最后一个状态就是答案,运行都3s多了居然还可以过,这道题好像没什么意义啊,没看出这道题的价值在哪。
#include <stdio.h>
#include <queue>
#include <set>
#include <string.h>
using namespace std;
struct state
{
int blank_i, blank_j;
char m[4][4];
int step;
char solution[100];
};
int _hash(const struct state &sta)
{
int sum;
int cifang;
cifang = 1;
sum = 0;
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
sum += sta.m[i][j]*cifang;
cifang *= 10;
}
}
return sum;
}
queue<struct state> pq;
set<int> visited;
struct state result;
void bfs()
{
struct state sta, sta_top;
int hv;
while(!pq.empty())
{
memcpy(&sta_top, &(pq.front()), sizeof(struct state));
pq.pop();
//printf("step=%d\n", sta_top.step);
if(pq.empty() && sta_top.step!=0)
{
memcpy(&result, &sta_top, sizeof(struct state));
result.solution[result.step+1] = '\0';
break;
}
memcpy(&sta, &sta_top, sizeof(struct state));
if(sta.blank_i >= 2)
{
sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i-1][sta.blank_j];
sta.m[sta.blank_i-1][sta.blank_j] = 0;
hv = _hash(sta);
if(visited.find(hv) == visited.end())
{
sta.blank_i--;
sta.step++;
sta.solution[sta.step] = 'U';
visited.insert(hv);
pq.push(sta);
}
}
memcpy(&sta, &sta_top, sizeof(struct state));
if(sta.blank_i <= 2)
{
sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i+1][sta.blank_j];
sta.m[sta.blank_i+1][sta.blank_j] = 0;
hv = _hash(sta);
if(visited.find(hv) == visited.end())
{
sta.blank_i++;
sta.step++;
sta.solution[sta.step] = 'D';
visited.insert(hv);
pq.push(sta);
}
}
memcpy(&sta, &sta_top, sizeof(struct state));
if(sta.blank_j >= 2)
{
sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i][sta.blank_j-1];
sta.m[sta.blank_i][sta.blank_j-1] = 0;
hv = _hash(sta);
if(visited.find(hv) == visited.end())
{
sta.blank_j--;
sta.step++;
sta.solution[sta.step] = 'L';
visited.insert(hv);
pq.push(sta);
}
}
memcpy(&sta, &sta_top, sizeof(struct state));
if(sta.blank_j <= 2)
{
sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i][sta.blank_j+1];
sta.m[sta.blank_i][sta.blank_j+1] = 0;
hv = _hash(sta);
if(visited.find(hv) == visited.end())
{
sta.blank_j++;
sta.step++;
sta.solution[sta.step] = 'R';
visited.insert(hv);
pq.push(sta);
}
}
}
}
void func(int case_count, const struct state &sta)
{
int hv;
visited.clear();
while(!pq.empty()) pq.pop();
hv = _hash(sta);
visited.insert(hv);
pq.push(sta);
bfs();
printf("Puzzle #%d\n", case_count);
for(int i=1; i<=3; i++)
printf("%d %d %d\n", result.m[i][1], result.m[i][2], result.m[i][3]);
printf("%s\n\n", result.solution+1);
}
char buf[100];
int main(void)
{
int n, i, j;
int ii, jj;
struct state sta;
//freopen("input.dat", "r", stdin);
gets(buf);
sscanf(buf, "%d", &n);
for(i=1; i<=n; i++)
{
gets(buf);
for(j=1; j<=3; j++)
{
gets(buf);
sscanf(buf, "%d %d %d", &(sta.m[j][1]), &(sta.m[j][2]), &(sta.m[j][3]));
}
for(ii=1; ii<=3; ii++)
{
for(jj=1; jj<=3; jj++)
{
if(sta.m[ii][jj] == 0)
{
sta.blank_i = ii;
sta.blank_j = jj;
goto run_func;
}
}
}
run_func:
sta.step = 0;
func(i, sta);
}
return 0;
}