Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:怎么做啊?

Posted by LW945 at 2016-01-17 15:39:33 on Problem 1096
In Reply To:Re:怎么做啊? Posted by:dddpppbox at 2005-09-14 22:43:33
> #include <iostream>
> #include <stdio.h>
> #include <set>
> #include <stack>
> #include <vector>
> #include <queue>
> using namespace std;
> int m,n,k,num;
> inline void kuo(int t,int cas,int &cnt);
> vector <bool> cube(216000);
> int op[216000];
> inline void input();
> 
> inline int answer();
> inline void chu();
> inline int kk(int temp,int cas,int open[],queue <int> &t);
> inline bool tt(int ,int ,int);
> int main(int argc, char* argv[])
> {
>         while(1)
>         {
>                 int a;
>                 //init();
>                 cin>>n>>m>>k>>num;
>                 if(m==n && n==k && k==num && num==0) break;
>                 input();
> 	        chu();
>                 a=answer();
>                 cout<<"The number of faces needing shielding is "
>                     <<a<<"."<<endl;
> 
>         }
>         return 0;
> }
> inline int answer()
> {
>         int cnt=0;
>         for(int i=0;i<m*n*k;++i)
>         {
>                 if(cube[i])
>                 {
>                         int mm,nn,kk;
>                         nn=i%n; mm=i/n%m; kk=i/(m*n)%k ;
>                         if(tt(nn-1,mm,kk)) cnt+=1;
>                         if(tt(nn+1,mm,kk)) cnt+=1;
>                         if(tt(nn,mm-1,kk)) cnt+=1;
>                         if(tt(nn,mm+1,kk)) cnt+=1;
>                         if(tt(nn,mm,kk-1)) cnt+=1;
>                         if(tt(nn,mm,kk+1)) cnt+=1;
>                 }
>         }
>         return cnt;
> }
> inline bool tt(int nn,int mm,int kk)
> {
>         if(nn>=n || nn<0 || mm>=m || mm<0 || kk>=k || kk<0) {return true;}
>         if(cube[kk*m*n+mm*n+nn]!=true) {return true;}
>         return false;
> }
> inline void input()
> {
>         int temp;
>         for(int i=0;i<m*n*k;++i)
>                 cube[i]=false;
>         for(int i=0;i<num;i+=1)
>         {
>                 scanf("%d",&temp);
>                 cube[temp]=true;
>         }
> 
> }
> inline void chu()
> {
>   queue <int> t;
>   bool flag=false;
>   int newvalue;
>   for(int i=0;i<m*n*k;++i)
>   {
>         op[i]=0;
>         if(cube[i])op[i]=1;
>   }
>   for(int i=0;i<m*n*k;++i)
>   {
>         if(op[i]==1 || op[i]==3) continue;
>         while(!t.empty())
>                 t.pop();
>         flag=false;
>         op[i]=2;
>         t.push(i);
>         while(!t.empty()&& (!flag))
>         {
> 	        newvalue=t.front();t.pop();
> 	        for(int i=0;i<6 && (!flag);++i){
> 	                switch(kk(newvalue,i,op,t))
> 	                {
> 	                case 0: flag=true;break;
> 	                case 1: break;
> 	                case -1:break;
> 	                }
> 	        }
>         }
>         if(!flag)
>               for(int i=0;i<m*n*k;++i)
> 	        if(op[i]==2)
> 	        { op[i]=1; cube[i]=true;}
>   }
> }
> inline int kk(int temp,int cas,int open[],queue <int> &t)
> {
>         int mm,nn,kk;
>         bool flag=false;
>         nn=temp%n;mm=temp/n%m;kk=temp/(m*n)%k;
>         switch(cas)
>         {
>                 case 0: kk-=1; break;
>                 case 1: kk+=1; break;
>                 case 2: mm+=1; break;
>                 case 3: mm-=1; break;
>                 case 4: nn+=1; break;
>                 case 5: nn-=1; break;
>         }
>         if(kk>=k || mm>=m || nn>=n || kk<0 || mm<0 || nn<0)
>         {
> 	  for(int i=0;i<m*n*k;++i)
> 	      if(open[i]==2)
> 		  open[i]=3;
> 	  return 0;
>         }
>         temp=kk*m*n+mm*n+nn;
>         if(open[temp]==1)
> 	    return 1;
> 	else if(open[temp]==0)
>         {
> 	    open[temp]=2;
> 	    t.push(temp);
> 	    return -1;
>         }
>         else
>         {
>                 open[temp]=3;
>                 for(int i=0;i<m*n*k;++i)
>                         if(open[i]==2)
>                                 open[i]=3;
>         }
>         return 0;
> }
> 
> /*inline int answer()
> {
>         int nvalue,temp=0,cnt=0;
>         while(!cube[temp])
>                 temp+=1;
>         open.push(temp);
>         close.insert(temp);
>         while(!open.empty())
>         {
>                 nvalue=open.top();open.pop();
>                 for(int i=0;i<6;++i)
>                 {
>                         kuo(nvalue,i,cnt);
>                 }
>         }
>         return cnt;
> }
> inline void kuo(int t,int cas,int &cnt)
> {
>         int mm,nn,kk;
>         bool flag=false;
>         nn=t%n;mm=t/n%m;kk=t/(m*n)%k;
>         switch(cas)
>         {
>                 case 0: kk-=1; break;
>                 case 1: kk+=1; break;
>                 case 2: mm+=1; break;
>                 case 3: mm-=1; break;
>                 case 4: nn+=1; break;
>                 case 5: nn-=1; break;
>         }
>         if(kk>=k || mm>=m || nn>=n || kk<0 || mm<0 || nn<0)
>         {
>                 cnt+=1;
>                 return;
>         }
>         t=kk*m*n+mm*n+nn;
>         if(cube[t] )
>         {
>                 if(close.count(t)) return;
>                 else
>                 {
>                         open.push(t);
>                         close.insert(t);
>                 }
>         }
>         else
>                 cnt+=1;
>         return;
> }
>   */
> 这是我的代码,不过TLE了
过了 153ms
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <set>
#include <string>
using namespace std;
struct point
{
	int x;
	int y;
	int z;
};
bool maze[65][65][65],vis[65][65][65][6],vis1[65][65][65],out[65][65][65]; 
int xx[]={0,0,-1,1,0,0},yy[]={0,0,0,0,-1,1},zz[]={1,-1,0,0,0,0};
int n,m,k,l,cnt;
point fir;
int judge(point a)
{
	if((a.y ==0 || a.y ==(m-1)) && (a.x ==0 || a.x  ==(n-1)))
		return 0;
	if((a.y ==0 || a.y ==(m-1)) || (a.x ==0 || a.x  ==(n-1)))
		return 0;
	if((a.z ==0 || a.z ==(k-1)))
		return 0;
	return 1;
}
void bfs1(point c1)
{
	queue<point> q;
	point p=c1,cur,nt;
	while(!q.empty())
		q.pop() ;
	q.push(p); 
	out[c1.z ][c1.y ][c1.x ]=1;
	vis1[c1.z ][c1.y ][c1.x ]=1; 
	while(!q.empty() )
	{
		cur=q.front() ;q.pop() ;
		for(int i=0;i<6;i++)
		{
			nt.z =cur.z +zz[i],nt.y =cur.y +yy[i],nt.x =cur.x +xx[i];
			if(!vis1[nt.z ][nt.y ][nt.x ] && !maze[nt.z ][nt.y ][nt.x ] && nt.x >=0 && nt.x <n &&nt.y >=0 && nt.y <m && nt.z >=0 && nt.z <k)
				vis1[nt.z ][nt.y ][nt.x ]=1,out[nt.z ][nt.y ][nt.x ]=1,q.push(nt); 
		}
	}	
}
void init()
{
	point cur;
	for(int i=0;i<k;i++)
		{
			for(int j=0;j<m;j++)	
				if(!maze[i][j][0] && !vis1[i][j][0])
					cur.z =i,cur.y =j,cur.x =0,bfs1(cur);
			for(int j=0;j<n;j++)
				if(!maze[i][0][j] && !vis1[i][0][j])
					cur.z =i,cur.y =0,cur.x =j,bfs1(cur);
			for(int j=0;j<m;j++)
				if(!maze[i][j][m-1] && !vis1[i][j][m-1])
					cur.z =i,cur.y =j,cur.x =m-1,bfs1(cur);
			for(int j=0;j<n;j++)
				if(!maze[i][m-1][j] && !vis1[i][m-1][j])
					cur.z =i,cur.y =m-1,cur.x =j,bfs1(cur);
		}
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
		{
			if(!maze[0][i][j] && !vis1[0][i][j])
					cur.z =0,cur.y =i,cur.x =j,bfs1(cur);
			if(!maze[k-1][i][j] && !vis1[k-1][i][j])
					cur.z =k-1,cur.y =i,cur.x =j,bfs1(cur);
		}
}
void bfs()
{
	int op;
	queue<point> q;
	point p,cur,next;
	while(!q.empty() )
		q.pop() ;
	p.x =fir.x ,p.y =fir.y ,p.z =fir.z ;
	q.push(p);
	while(!q.empty() )
	{
		cur=q.front() ;q.pop() ;
		for(int i=0;i<6;i++)
		{
			switch(i)
			{
				case 0:op=1;break;
				case 1:op=0;break;
				case 2:op=3;break;
				case 3:op=2;break;
				case 4:op=5;break;
				case 5:op=4;break;
				default:break;
			}
			next.x=cur.x +xx[i],next.y =cur.y +yy[i],next.z =cur.z +zz[i];
			if(maze[next.z ][next.y ][next.x ] && !vis[next.z ][next.y ][next.x ][op] && next.x >=0 && next.x <n &&next.y >=0 && next.y <m && next.z >=0 && next.z <k)
				cnt+=2,vis[next.z ][next.y ][next.x ][op]=1,vis[cur.z ][cur.y ][cur.x ][i]=1,q.push(next);
			else if(!maze[next.z ][next.y ][next.x ] && !vis[next.z ][next.y ][next.x ][op]&& !out[next.z ][next.y ][next.x ] && next.x >=0 && next.x <n &&next.y >=0 && next.y <m && next.z >=0 && next.z <k)
				vis[next.z ][next.y ][next.x ][op]=1,cnt++;
		}	
	} 
}
int main()
{
	int x,y,z,nb;
	while(~scanf("%d %d %d %d",&n,&m,&k,&l) && n)
	{
		cnt=0;
		memset(vis,0,sizeof(vis));
		memset(vis1,0,sizeof(vis1));
		memset(out,0,sizeof(out));
		memset(maze,0,sizeof(maze));
		for(int i=0;i<l;i++)
		{
			scanf("%d",&nb);
			z=nb/(n*m),y=(nb%(n*m))/n,x=(nb%(n*m))%n;
			if(!i)
				fir.z =z,fir.y=y,fir.x=x; 
			maze[z][y][x]=1;
		}
		init();
		bfs();
		printf("The number of faces needing shielding is %d.\n",l*6-cnt);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator