九度教程第87题

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

C语言源码:

#include<stdio.h>
#define maxsize 10000000
int queue[10000000][3];
int mark[110][110][110];
int main()
{
	int s,n,m,i,j,k,front,rear,flag,num,f;
	scanf("%d %d %d",&s,&n,&m);
	while(s||n||m)
	{
		for(i=0;i<110;i++)
			for(j=0;j<110;j++)
				for(k=0;k<110;k++)
					mark[i][j][k]=0;
		front=0;
		rear=1;
		flag=1;
		num=0;
		f=-1;
		queue[0][0]=s;
		queue[0][1]=0;
		queue[0][2]=0;
		if(s%2==1)
			printf("NO\n");
		else
		{
			while(front!=rear)
			{
				i=queue[front][0];
				j=queue[front][1];
				k=queue[front][2];
				front=(front+1)%maxsize;
				if(mark[i][j][k]!=1)
				{
					mark[i][j][k]=1;
					if((i==s/2&&j==s/2)||(i==s/2&&k==s/2)||(j==s/2&&k==s/2))
					{
						f=1;
						break;
					}
					if((i<=n-j)&&mark[0][j+i][k]==0)
					{
						queue[rear][0]=0;
						queue[rear][1]=j+i;
						queue[rear][2]=k;
						rear=(rear+1)%maxsize;
					}
					else if((i>n-j)&&(mark[i-(n-j)][n][k]==0))
					{
						queue[rear][0]=i-(n-j);
						queue[rear][1]=n;
						queue[rear][2]=k;
						rear=(rear+1)%maxsize;
					}
					if((i<=m-k)&&mark[0][j][k+i]==0)
					{
						queue[rear][0]=0;
						queue[rear][1]=j;
						queue[rear][2]=k+i;
						rear=(rear+1)%maxsize;
					}
					else if((i>m-k)&&(mark[i-(m-k)][j][m]==0))
					{
						queue[rear][0]=i-(m-k);
						queue[rear][1]=j;
						queue[rear][2]=m;
						rear=(rear+1)%maxsize;
					}
					if((j<=s-i)&&mark[i+j][0][k]==0)
					{
						queue[rear][0]=i+j;
						queue[rear][1]=0;
						queue[rear][2]=k;
						rear=(rear+1)%maxsize;
					}
					else if((j>s-i)&&(mark[s][j-(s-i)][k]==0))
					{
						queue[rear][0]=s;
						queue[rear][1]=j-(s-i);
						queue[rear][2]=k;
						rear=(rear+1)%maxsize;
					}
					if((j<=m-k)&&mark[i][0][k+j]==0)
					{
						queue[rear][0]=i;
						queue[rear][1]=0;
						queue[rear][2]=k+j;
						rear=(rear+1)%maxsize;
					}
					else if((j>m-k)&&(mark[s][j-(m-k)][m]==0))
					{
						queue[rear][0]=i;
						queue[rear][1]=j-(m-k);
						queue[rear][2]=m;
						rear=(rear+1)%maxsize;
					}
					if((k<=s-i)&&mark[i+k][j][0]==0)
					{
						queue[rear][0]=i+k;
						queue[rear][1]=j;
						queue[rear][2]=0;
						rear=(rear+1)%maxsize;
					}
					else if((k>s-i)&&(mark[s][j][k-(s-i)]==0))
					{
						queue[rear][0]=s;
						queue[rear][1]=j;
						queue[rear][2]=k-(s-i);
						rear=(rear+1)%maxsize;
					}
					if((k<=n-j)&&mark[i][j+k][0]==0)
					{
						queue[rear][0]=i;
						queue[rear][1]=j+k;
						queue[rear][2]=0;
						rear=(rear+1)%maxsize;
					}
					else if((k>n-j)&&(mark[i][n][k-(n-j)]==0))
					{
						queue[rear][0]=i;
						queue[rear][1]=n;
						queue[rear][2]=k-(n-j);
						rear=(rear+1)%maxsize;
					}
				}
				if(front==flag)
				{
					flag=rear;
					num++;
				}
			}
			if(f==-1)
				printf("NO\n");
			else
				printf("%d\n",num);
		}
		scanf("%d %d %d",&s,&n,&m);;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值