MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 2965

Posted on 2011-11-06 20:18  MDeath-Kid  阅读(247)  评论(0编辑  收藏  举报

WA 11 了  居然是没有去掉注释。。。。ORZ自己了,有自己一个响亮的耳光。

没什么难度,状态转移,BFS,然后打出答案就行了,记得有个点会被change2次,在变一次就行了

POJ 2965
/***
BFS

MDK 2965 Accepted 3620K 782MS G++ 2590B 2011-11-06 20:14:26


*/

struct node {
int sta;
int step;
int prenode;
int x,y;
node(int a=0,int b=0,int c=0,int d=0,int e=0)
:sta(a),step(b),prenode(c),x(d),y(e){}
};
char mat[5][5];
int sta,dex;
bool has[MAXN] = {0};
node Q[MAXNT];

int xytoline(int x,int y) {
return 4 * x + y;
}

int BFS() {
SET(has,0);
int front=0,rear=0;

Q[rear++] = node(sta,0,0);
node top(0,0);has[sta] = 1;
while(front != rear) {
top = Q[front++];

if(top.sta == 65535) {
dex = front - 1;
return top.step;
}
F(i,4) F(j,4) {
int sta = top.sta;
FOR(k,4*i,4*i + 3) {
sta ^= 1 << (k);
}
for(int k = 0;k<4;k++) {
sta ^= 1 << (xytoline(k,j));
}
sta ^= 1<<(xytoline(i,j));
if(!has[sta]) {
Q[rear ++] = node(sta,top.step + 1,front -1,i,j);
has[sta] = 1;
}
}
}
return -1;
}

void print(int x) {
if(Q[x].prenode) print(Q[x].prenode);
printf("%d %d\n",Q[x].x +1,Q[x].y+1);
}

int main () {
FOPEN

SET(mat,'\0');

while(~SCFS(mat[0])) {
SCFS(mat[1]);SCFS(mat[2]);SCFS(mat[3]);
sta = 0;
F(i,4) F(j,4) {
if(mat[i][j] == '-') {
sta |= 1 << (xytoline(i,j));
}
}

int ans = BFS();
if(ans != -1) {
PCFLN(ans);
if(dex)print(dex);
else puts("");
}
SET(mat,'\0');
}
}