今天做了第七题和第五题。
第五题
题意:是一个三维的地牢,给定起点和终点,问从起点到终点至少需要多长时间,每移动一次耗时1minute;如果不能到达终点,输出“Trapped!“。
思路:本题是一个普通的广搜题,但是是三维的,与二维的区别就在于从 每个点开始搜索时都会有6个方向,所以要设置6个方向向量,然后每搜到一个点就判断是不是终点。利用队列即可。 但是后来在几个细节上出了错误。
关键代码:
int bfs()
{
int i;
node a,next;
queue<node> Q;
a.x = sx,a.y = sy,a.z = sz;
a.step = 0;
visit[sx][sy][sz] = 1;
Q.push(a);
while(!Q.empty())
{
a = Q.front();
Q.pop();
if(a.x == ex && a.y == ey && a.z == ez)
return a.step;
for(i = 0; i<6; i++)
{
next = a;
next.x = a.x+to[i][0];
next.y = a.y+to[i][1];
next.z = a.z+to[i][2];
if(check(next.x,next.y,next.z))
continue;
visit[next.x][next.y][next.z] = 1;
next.step = a.step+1;
Q.push(next);
}
}
return 0;
}
第七题:
题意:找一个比N大于等于的数,使这个数每一位只有0和1,且能被N整除。
思路:本题我用了同余模定理:
(a*b)%n = (a%n *b%n)%n;
(a+b)%n = (a%n +b%n)%n;
本题要注意数据的类型,要定义成long long 类型。