POJ 2965 The Pilots Brothers' refrigerator
这个题是一个枚举题。
用的是八皇后算法。
具体操作不说了。
下面是代码:
#include <stdio.h> struct node { int x,y; }de[200],dr[200]; int a[17],b,w,min,cut; void ro(int i) { int j=4; while(i-j>=0) { if(a[i-j]==0) { a[i-j]=1; w--; b++; } else { a[i-j]=0; w++; b--; } j+=4; } j=4; while(i+j<16) { if(a[i+j]==0) { a[i+j]=1; w--; b++; } else { a[i+j]=0; w++; b--; } j+=4; } } void co(int i) { int j=1; while(i+j<16&&i/4==(i+j)/4) { if(a[i+j]==0) { a[i+j]=1; w--; b++; } else { a[i+j]=0; w++; b--; } j++; } j=1; while(i-j>=0&&i/4==(i-j)/4) { if(a[i-j]==0) { a[i-j]=1; w--; b++; } else { a[i-j]=0; w++; b--; } j++; } } void fib(int i) { int j,g; if(i==-1) { for(j=i+1; j<16; j++) { fib(j); } } else { if(cut==0&&b==0) { min=cut; return ; } if(a[i]==0) { a[i]=1; w--; b++; } else { a[i]=0; w++; b--; } ro(i); co(i); de[cut].x=i/4; de[cut].y=i%4; cut++; if(b==0&&min>cut) { for(g=0;g<cut;g++) { dr[g]=de[g]; } min=cut; } else { for(j=i+1; j<16; j++) { fib(j); } } if(a[i]==0) { a[i]=1; w--; b++; } else { a[i]=0; w++; b--; } ro(i); co(i); cut--; } } int main() { int i,j; char s[6]; while(scanf("%s",s)!=EOF) { b=0; w=0; min=1<<30; cut=0; for(i=0; i<4; i++) { if(s[i]=='+') { a[i]=1; b++; } else if(s[i]=='-') { a[i]=0; w++; } } for(i=1; i<4; i++) { scanf("%s",s); for(j=0; j<4; j++) { if(s[j]=='+') { a[i*4+j]=1; b++; } else if(s[j]=='-') { a[i*4+j]=0; w++; } } } fib(-1); printf("%d\n",min); for(i=0; i<min; i++) { printf("%d %d\n",dr[i].x+1,dr[i].y+1); } } return 0; }