POJ 2965 The Pilots Brothers' refrigerator

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2965 The Pilots Brothers' refrigerator相关的知识,希望对你有一定的参考价值。

原题链接:http://poj.org/problem?id=2965

简单的dfs,因为是要求最小值,枚举深度来得到递归终止条件,和 poj1753很像,毕竟是放在一起的。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <cstdlib>
  7. #include <vector>
  8. #include <string>
  9. #define CLR(arr) memset(arr,0,sizeof(arr))
  10. #define N 100001
  11. #define MOD 1E9+7
  12. //#define LOCAL
  13. typedef long long ll;
  14. using namespace std;
  15. int cmp(const void*c,const void*d){return 1;}//上面的一大堆基本没卵用,只是为了用到时不用再打,反正编译太久又不吃亏
  16. char handle[4][4];
  17. int h[6][6];
  18. int step,flag,fa[2][50],top;
  19. void flip(int row,int col){
  20.     for(int i=1;i<=4;i++)h[i][col]^=1;
  21.     for(int j=1;j<=4;j++)if(j!=col)h[row][j]^=1;//使该行与该列翻转
  22.     return;
  23. }
  24. bool isopen(){
  25.     for(int i=1;i<=4;i++)
  26.         for(int j=1;j<=4;j++)
  27.             if(h[i][j])return false;
  28.     return true;//判断是否开了
  29. }
  30. void dfs(int row,int col,int deep){
  31.     if(deep==step){
  32.         if(isopen()){
  33.             printf("%d\n",step);
  34.             for(int i=0;i<top;i++)printf("%d %d\n",fa[0][i],fa[1][i]);
  35.             flag=1;
  36.         }
  37.         return;
  38.     }
  39.     if(flag||row==5)return ;
  40.     fa[0][top]=row;
  41.     fa[1][top++]=col;//保存路径,其实可以通过将dfs改成带int返回值,加判断来省去,说不定还能减时间
  42.     flip(row,col);
  43.     if(col<4)
  44.         dfs(row,col+1,deep+1);
  45.     else
  46.         dfs(row+1,1,deep+1);
  47.     top--;
  48.     flip(row,col);
  49.     if(col<4)
  50.         dfs(row,col+1,deep);
  51.     else
  52.         dfs(row+1,1,deep);
  53.     return;
  54. }
  55. int main()
  56. {
  57.     #ifdef LOCAL
  58.     freopen("input.txt", "r", stdin);
  59.     //freopen("output.txt", "w", stdout);
  60.     #endif
  61.     for(int i=0;i<4;i++){
  62.         scanf("%s",handle[i]);
  63.         for(int j=1;j<=4;j++)h[i+1][j]=(handle[i][j-1]==‘+‘);
  64.     }
  65.     for(step=1;;step++){
  66.         dfs(1,1,0);
  67.         if(flag)break;
  68.     }
  69.     return 0;
  70. }

我能吐槽我其实根本看不懂题面内容是什么吗。。其实这么水的题不太好意思放上去,但是就当纪念吧,毕竟poj训练第一炮。。

以上是关于POJ 2965 The Pilots Brothers' refrigerator的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2965 The Pilots Brothers' refrigerator

poj 2965 The Pilots Brothers&#39; refrigerator

POJ 2965 The Pilots Brothers' refrigerator (暴力枚举)

POJ 2965.The Pilots Brothers‘ refrigerator

POJ 2965.The Pilots Brothers‘ refrigerator

poj2965 The Pilots Brothers' refrigerator 枚举或DFS