| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:怎么做啊?In Reply To:Re:怎么做啊? Posted by:dddpppbox at 2005-09-14 22:43:08 #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了
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator