您的位置:首页 > 运维架构

zoj 2416 Open the Lock

2010-04-30 16:44 531 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1416

BFS题哈..这题很纠结.搞了很长时间..想节省一下空间.结果却花了我半天时间,一直找不到错误.后来上98去发帖.在t_nt的帮助下终于发现错

误,原来搞错了进制啊..

这道题是对四个数一次进行BFS,BFS的时候进行四种操作: 左右互换,自增,自减.然后将得到的四个值放入队列中,并且将那种状态标记为true.

就在这里我犯了一个大错.因为他的数的范围是[1,9],然后我就开了一个6561大小的数组,但是在保存状态时,我却用十进制去表示.哎..其实

本来将数组开成10 * 10 * 10 * 10就不会犯这种错误了..

看代码吧

/*
* 2416.cpp
*
*  Created on: Apr 29, 2010
*      Author: wyy
*
*/

#include<cstdio>
#include<queue>
using namespace std;

char str[5];
int Start[4];
int End[4];
bool marked[6561];

int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};

struct lock
{
int num[4];
int ret;
};

void Init()
{
scanf("%s", str);
for(int i = 0; i < 4; ++i)
Start[i] = str[i] - '0';

scanf("%s", str);
for(int i = 0; i < 4; ++i)
End[i] = str[i] - '0';

for(int i = 0; i < 6561; ++i)
marked[i] = false;
}

void BFS()
{
queue<lock> Q;
lock m, n;
int flag, sum;
for(int i = 0; i < 4; ++i)
m.num[i] = Start[i];
sum = (Start[0] - 1) * 729 + (Start[1] - 1) * 81 + (Start[2] - 1) * 9 + Start[3] - 1;
marked[sum] = true;
m.ret = 0;
Q.push(m);
while(!Q.empty())
{
m = Q.front();
Q.pop();
for(flag = 0; flag < 4; ++flag)
if(m.num[flag] != End[flag])
break;
if(flag == 4)
{
printf("%d/n", m.ret);
break;
}
for(int i = 0; i < 4; ++i)		//deal with 4 numbers
for(int j = 0; j < 4; ++j)	//deal with 4 conditions: swap, ++, --
{
for(int k = 0; k < 4; ++k)
n.num[k] = m.num[k];

int x = m.num[i] + dx[j];
int y = i + dy[j];

if(dy[j] != 0 && y >= 0 && y < 4) // swap
{
n.num[i] = m.num[y];
n.num[y] = m.num[i];
}

else if(dx[j] != 0)		// ++ or --
n.num[i] = (x + 8) % 9 + 1;

sum = (n.num[0] - 1) * 729 + (n.num[1] - 1) * 81 + (n.num[2] - 1) * 9 + n.num[3] - 1;
if(!marked[sum])
{
marked[sum] = true;
n.ret = m.ret + 1;
Q.push(n);
}
}
}
}

int main()
{
//freopen("input.txt", "r", stdin);
int N;
scanf("%d", &N);
while(N--)
{
Init();
BFS();
}
//fclose(stdin);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: