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');
}
}