1022

这道题我花了将近半天的时间读题— —!

英文好真是太重要了。。。

题目还行DFS,种子填充法,这是同学告诉我的,我之前只知道这叫floodfill。孤陋寡闻了。

代码是0ms的,内存多了点。不知道那些超神的代码怎么弄的。

对了,这个也是看了思路,背着写的— —!

有意思的是,我把别人的代码交,是wa,我的就ac了。搞不懂了。

#include <stdio.h> #include <map> using namespace std; int sign; struct Cube { int used; int cood[4]; int neighbour[4][2]; } cube[100]; int minmax[4][2]; void init() { sign=0; for(int i=0; i<4; ++i) { minmax[i][0]=minmax[i][1]=0; cube[0].cood[i]=0; } for(int i=0; i<100; ++i) cube[i].used=0; } void FloodFill(int row) { cube[row].used=1; for(int i=0; i<4; ++i) for(int j=0; j<2; ++j) if(cube[row].neighbour[i][j]!=-1&&!cube[cube[row].neighbour[i][j]].used) { for(int k=0; k<4; ++k) cube[cube[row].neighbour[i][j]].cood[k]=cube[row].cood[k]; if(0==j) { --cube[cube[row].neighbour[i][j]].cood[i]; if(minmax[i][0]>cube[cube[row].neighbour[i][j]].cood[i]) minmax[i][0]=cube[cube[row].neighbour[i][j]].cood[i]; } else { ++cube[cube[row].neighbour[i][j]].cood[i]; if(minmax[i][1]<cube[cube[row].neighbour[i][j]].cood[i]) minmax[i][1]=cube[cube[row].neighbour[i][j]].cood[i]; } FloodFill(cube[row].neighbour[i][j]); } } inline bool All(int num) { for(int i=0; i<num; ++i) if(!cube[i].used) return false; return true; } inline void output() { int a=1; for (int i = 0; i < 4; ++i) a *= minmax[i][1] - minmax[i][0] + 1; printf("%d/n",a); } int main() { int t; map<int,int> idmap; scanf("%d",&t); while(t--) { init(); idmap.clear(); int num,id; scanf("%d", &num); for(int i=0; i<num; ++i) { scanf("%d",&id); idmap[id]=i; for(int j=0; j<4; ++j) for(int k=0; k<2; ++k) { scanf("%d",&id); cube[i].neighbour[j][k]=id; } } for(int i=0; i<num; ++i) for(int j=0; j<4; ++j) for(int k=0; k<2; ++k) { if(cube[i].neighbour[j][k]==0) cube[i].neighbour[j][k]=-1; else cube[i].neighbour[j][k]=idmap[cube[i].neighbour[j][k]]; } for(int i=0; i<num&&sign!=-1; ++i) for(int j=0; j<4&&sign!=-1; ++j) for(int k=0; k<2&&sign!=-1; ++k) if(cube[i].neighbour[j][k]!=-1&&cube[cube[i].neighbour[j][k]].neighbour[j][1-k]!=i) sign=-1; if(sign==-1) { printf("Inconsistent/n"); continue; } else FloodFill(0); if(All(num)) output(); else printf("Inconsistent/n"); } return 0; }  

四维怪吓人的。

你可能感兴趣的:(1022)