您的位置:首页 > 编程语言 > C语言/C++

ZOJ2714迭代更新

2015-07-13 20:05 344 查看
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

#define  REP(i,n) for(int i=0;i<n;++i)

static const int maxn = 10;
static int n;
static char pos[maxn][maxn][maxn];
static char view[6][maxn][maxn];

static char read_char()
{
char ch;
for (;;)
{
ch = getchar();
if ((ch>='A'&&ch<='Z')||ch=='.')
return ch;
}
}

static void get(int k,int i,int j,int len,int &x,int &y,int &z)
{
if (k==0){x = len;y=j;z=i;}
if (k==1){x=n-1-j;y=len;z=i;}
if(k==2){x=n-1-len;y=n-1-j;z=i;}
if(k==3){x=j;y=n-1-len;z=i;}
if(k==4){x=n-1-i;y=j;z=len;}
if(k==5){x=i;y=j;z=n-1-len;}
}

int main()
{
while(scanf("%d",&n)&&n)
{
REP(i,n)REP(k,6)REP(j,n)view[k][i][j] = read_char();
REP(i,n)REP(j,n)REP(k,n) pos[i][j][k] = '#';

REP(k,6)REP(i,n)REP(j,n)if (view[k][i][j]=='.')
REP(p,n){
int x,y,z;
get(k,i,j,p,x,y,z);
pos[x][y][z] = '.';
}

//看是否能继续消除
for (;;)
{
bool done = true;
//通过不同方向观察然后设置颜色
REP(k,6)REP(i,n)REP(j,n)if (view[k][i][j]!='.'){
REP(p,n){//将当前深度所有颜色设置为k,i,j然后检测其他方向观察的时候可能的深度
int x,y,z;
get(k,i,j,p,x,y,z);
if (pos[x][y][z]=='.')
continue;
if (pos[x][y][z]=='#')//当前颜色不确定的时候根据观察方向确定当前这一深度的颜色
{
pos[x][y][z] = view[k][i][j];
break;
}
//然后当不同方向观察的时候
if (pos[x][y][z]==view[k][i][j])
break;
//颜色不同那么该位置必然是空的
pos[x][y][z] = '.';
done = false;
}
}
if (done)
break;
}

int ans = 0;
REP(i,n)REP(j,n)REP(k,n)
if (pos[i][j][k]!='.')
ans++;
printf("Maximum weight: %d gram(s)\n",ans);
}
return  0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  迭代 zoj c++ algorithm