和POJ1753的方法一致,唯一不同的是需要记录路径,只需添加一个全集变量的path路径即可。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int INF=100000; 5 int map[4][4]; 6 int path[4][4]; 7 int maxpath[4][4]; 8 int ans=INF; 9 10 void open(int step,int turn) 11 { 12 int tempmap[4][4]; 13 if (turn>=ans) return; 14 if (step==16) 15 { 16 int sum=0; 17 for (int i=0;i<4;i++) 18 for (int j=0;j<4;j++) sum+=map[i][j]; 19 if (sum==0) 20 { 21 ans=turn; 22 for (int i=0;i<4;i++) 23 for (int j=0;j<4;j++) maxpath[i][j]=path[i][j]; 24 } 25 } 26 else 27 { 28 for (int i=0;i<4;i++) 29 for (int j=0;j<4;j++) tempmap[i][j]=map[i][j]; 30 for (int d=0;d<2;d++) 31 { 32 int x=step/4,y=step%4; 33 path[x][y]=d; 34 if (d==1) 35 { 36 map[x][y]=1-map[x][y]; 37 for (int i=0;i<4;i++) 38 { 39 map[i][y]=1-map[i][y]; 40 map[x][i]=1-map[x][i]; 41 } 42 } 43 open(step+1,turn+d); 44 for (int i=0;i<4;i++) 45 for (int j=0;j<4;j++) map[i][j]=tempmap[i][j]; 46 } 47 } 48 } 49 50 int main() 51 { 52 for (int i=0;i<4;i++) 53 { 54 char c; 55 for (int j=0;j<4;j++) 56 { 57 scanf("%c",&c); 58 if (c==‘-‘) map[i][j]=0; 59 else map[i][j]=1; 60 } 61 getchar(); 62 } 63 open(0,0); 64 cout<<ans<<endl; 65 for (int i=0;i<4;i++) 66 for (int j=0;j<4;j++) 67 if (maxpath[i][j]==1) cout<<i+1<<‘ ‘<<j+1<<endl; 68 return 0; 69 }
【递归】POJ2965-The Pilots Brothers' refrigerator
时间: 2024-10-17 04:15:47