9度教程第86题

九度教程第86题

题目地址:http://jobdu.sinaapp.com/problem.php?cid=1040&pid=85

C语言源码:

#include<stdio.h>
int s[51][51][51];
int queue[500000][3];
int main()
{
	int i,j,k,T,n,a,b,c,front,rear,num,flag;
	while(scanf("%d",&n)!=EOF)
	{
		while(n--)
		{
			scanf("%d %d %d %d",&a,&b,&c,&T);
			for(i=0;i<a;i++)
				for(j=0;j<b;j++)
					for(k=0;k<c;k++)
						scanf("%d",&s[i][j][k]);
			if(s[a-1][b-1][c-1]==1)
			{
				printf("-1\n");
				continue;
			}
			s[0][0][0]=0;
			front=0;
			rear=0;
			num=0;
			flag=1;
			queue[0][0]=0;
			queue[0][1]=0;
			queue[0][2]=0;
			rear++;
			while(front!=rear)
			{
				i=queue[front][0];
				j=queue[front][1];
				k=queue[front][2];
				front++;
				if(s[i][j][k]!=1)
				{
					s[i][j][k]=1;
					if(i==a-1&&j==b-1&&k==c-1)
						break;
					if(i>0&&s[i-1][j][k]==0)
					{
						queue[rear][0]=i-1;
						queue[rear][1]=j;
						queue[rear][2]=k;
						rear++;
					}
					if(i<a-1&&s[i+1][j][k]==0)
					{
						queue[rear][0]=i+1;
						queue[rear][1]=j;
						queue[rear][2]=k;
						rear++;
					}
					if(j>0&&s[i][j-1][k]==0)
					{
						queue[rear][0]=i;
						queue[rear][1]=j-1;
						queue[rear][2]=k;
						rear++;
					}
					if(j<b-1&&s[i][j+1][k]==0)
					{
						queue[rear][0]=i;
						queue[rear][1]=j+1;
						queue[rear][2]=k;
						rear++;
					}
					if(k>0&&s[i][j][k-1]==0)
					{
						queue[rear][0]=i;
						queue[rear][1]=j;
						queue[rear][2]=k-1;
						rear++;
					}
					if(k<c-1&&s[i][j][k+1]==0)
					{
						queue[rear][0]=i;
						queue[rear][1]=j;
						queue[rear][2]=k+1;
						rear++;
					}
				}
				if(front==flag)
				{
					flag=rear;
					num++;
				}
			}
			if(num<=T&&s[a-1][b-1][c-1]==1)
				printf("%d\n",num);
			else
				printf("-1\n");
		}
	}
}