#include <stdio.h>
#include <cstring>
#include <queue>using namespace std;
struct Node
{
int x, y;
};int map[5][8];
queue<Node> q;int BFS()
{
int nx = 0, ny = 0;
int ans = 0;
while(!q.empty())
{
Node cur = q.front();
q.pop();
nx = cur.x;
ny = cur.y - 1;
if(ny < 0)
continue;
if(map[nx][ny] % 10 == 7) //如果这个数的个位是7,则没有后继
continue;
if(map[nx][ny] == 0) //如果空格的旁边还是空格
{
ny--;
cur.y--; //cur也要左移一个
}
bool flag = false;
for(int i = 1; i < 5; i++)
{
flag = false;
for(int j = 1; j < 8; j++)
{
if(map[i][j] == map[nx][ny] + 1)
{
printf("(%d,%d) %d->(%d,%d) %d\n", nx, ny, map[nx][ny], i,j,map[i][j]);
Node tmp;
tmp.x = i;
tmp.y = j;
q.push(tmp);
map[cur.x][cur.y] = map[i][j];
map[i][j] = 0;
ans++;
flag = true;
break;
}
}
if(flag)
break;
}
for(int i = 1; i < 5; i++)
{
for(int j = 0; j < 8; j++)
printf("%d ", map[i][j]);
printf("\n");
}
printf("\n");
}
for(int i = 1; i < 5; i++)
for(int j = 0; j < 6; j++)
if(map[i][j] > map[i][j+1])
return -1;
return ans;
}int main()
{
int n;
scanf("%d", &n);
while(n--)
{
while(!q.empty())
q.pop();
for(int i = 1; i < 5; i++)
for(int j = 1; j < 8; j++)
{
scanf("%d", &map[i][j]);
if(map[i][j] % 10 == 1)
{
map[map[i][j]/10][0] = map[i][j];
Node tmp; //用来标记空位
tmp.x = i;
tmp.y = j;
q.push(tmp);
map[i][j] = 0;
}
}
int ans = BFS();
printf("%d\n", ans);
for(int i = 1; i < 5; i++)
{
for(int j = 0; j < 8; j++)
printf("%d ", map[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}
Gap HDU - 1067(BFS)(未ac)
最新推荐文章于 2018-10-11 01:01:47 发布
