POJ 2965 The Pilots Brothers' refrigerator
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2965 The Pilots Brothers' refrigerator相关的知识,希望对你有一定的参考价值。
原题链接:http://poj.org/problem?id=2965
简单的dfs,因为是要求最小值,枚举深度来得到递归终止条件,和 poj1753很像,毕竟是放在一起的。
-
#include <iostream>
-
#include <cstdio>
-
#include <queue>
-
#include <cstring>
-
#include <cmath>
-
#include <cstdlib>
-
#include <vector>
-
#include <string>
-
#define CLR(arr) memset(arr,0,sizeof(arr))
-
#define N 100001
-
#define MOD 1E9+7
-
//#define LOCAL
-
typedef long long ll;
-
using namespace std;
-
int cmp(const void*c,const void*d){return 1;}//上面的一大堆基本没卵用,只是为了用到时不用再打,反正编译太久又不吃亏
-
char handle[4][4];
-
int h[6][6];
-
int step,flag,fa[2][50],top;
-
void flip(int row,int col){
-
for(int i=1;i<=4;i++)h[i][col]^=1;
-
for(int j=1;j<=4;j++)if(j!=col)h[row][j]^=1;//使该行与该列翻转
-
return;
-
}
-
bool isopen(){
-
for(int i=1;i<=4;i++)
-
for(int j=1;j<=4;j++)
-
if(h[i][j])return false;
-
return true;//判断是否开了
-
}
-
void dfs(int row,int col,int deep){
-
if(deep==step){
-
if(isopen()){
-
printf("%d\n",step);
-
for(int i=0;i<top;i++)printf("%d %d\n",fa[0][i],fa[1][i]);
-
flag=1;
-
}
-
return;
-
}
-
if(flag||row==5)return ;
-
fa[0][top]=row;
-
fa[1][top++]=col;//保存路径,其实可以通过将dfs改成带int返回值,加判断来省去,说不定还能减时间
-
flip(row,col);
-
if(col<4)
-
dfs(row,col+1,deep+1);
-
else
-
dfs(row+1,1,deep+1);
-
top--;
-
flip(row,col);
-
if(col<4)
-
dfs(row,col+1,deep);
-
else
-
dfs(row+1,1,deep);
-
return;
-
}
-
int main()
-
{
-
#ifdef LOCAL
-
freopen("input.txt", "r", stdin);
-
//freopen("output.txt", "w", stdout);
-
#endif
-
for(int i=0;i<4;i++){
-
scanf("%s",handle[i]);
-
for(int j=1;j<=4;j++)h[i+1][j]=(handle[i][j-1]==‘+‘);
-
}
-
for(step=1;;step++){
-
dfs(1,1,0);
-
if(flag)break;
-
}
-
return 0;
-
}
我能吐槽我其实根本看不懂题面内容是什么吗。。其实这么水的题不太好意思放上去,但是就当纪念吧,毕竟poj训练第一炮。。
以上是关于POJ 2965 The Pilots Brothers' refrigerator的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2965 The Pilots Brothers' refrigerator
poj 2965 The Pilots Brothers' refrigerator
POJ 2965 The Pilots Brothers' refrigerator (暴力枚举)
POJ 2965.The Pilots Brothers‘ refrigerator