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; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解