POJ 2965 The Pilots Brothers' refrigerator (暴力枚举)
Posted fht-litost
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2965 The Pilots Brothers' refrigerator (暴力枚举)相关的知识,希望对你有一定的参考价值。
https://vjudge.net/problem/POJ-2965
与poj-1753相似,只不过这个要记录路径。poj-1753:https://www.cnblogs.com/fht-litost/p/9160723.html
题意
4*4的方格,翻转其中的一个把手,会带动同行同列的把手一起动。现要求把所有把手都翻成‘-’状态,问最少需要几步。
分析
异曲同工之妙。加个vector记录路径即可。使用状态压缩的写法输出路径也很方便。
#include<iostream> #include<cmath> #include<cstring> #include<queue> #include<vector> #include<cstdio> #include<algorithm> #include<map> #include<set> #define rep(i,e) for(int i=0;i<(e);i++) #define rep1(i,e) for(int i=1;i<=(e);i++) #define repx(i,x,e) for(int i=(x);i<=(e);i++) #define X first #define Y second #define PB push_back #define MP make_pair #define mset(var,val) memset(var,val,sizeof(var)) #define scd(a) scanf("%d",&a) #define scdd(a,b) scanf("%d%d",&a,&b) #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c) #define pd(a) printf("%d ",a) #define scl(a) scanf("%lld",&a) #define scll(a,b) scanf("%lld%lld",&a,&b) #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c) #define IOS ios::sync_with_stdio(false);cin.tie(0) using namespace std; typedef long long ll; template <class T> void test(T a){cout<<a<<endl;} template <class T,class T2> void test(T a,T2 b){cout<<a<<" "<<b<<endl;} template <class T,class T2,class T3> void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;} template <class T> inline bool scan_d(T &ret){ char c;int sgn; if(c=getchar(),c==EOF) return 0; while(c!=‘-‘&&(c<‘0‘||c>‘9‘)) c=getchar(); sgn=(c==‘-‘)?-1:1; ret=(c==‘-‘)?0:(c-‘0‘); while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret = ret*10+(c-‘0‘); ret*=sgn; return 1; } const int N = 1e6+10; const int inf = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3fll; const ll mod = 1000000000; int T; void testcase(){ printf("Case %d:",++T); } const int MAXN = 5e5+10 ; const int MAXM = 150; const double eps = 1e-8; const double PI = acos(-1.0); int n; int g[5][5]; bool f; vector<pair<int,int> > vec; bool check(){ int t = 1; for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(t!=g[i][j]) return false; return true; } void flip(int x,int y){ g[x][y] = 1-g[x][y]; //需要额外再翻转 for(int i=0;i<4;i++){ g[x][i]=1-g[x][i]; g[i][y]=1-g[i][y]; } } void dfs(int x,int y,int state){ if(state==0){ f = check(); if(f){ cout<<n<<endl; for(int i=0;i<n;i++){ printf("%d %d ",vec[i].X+1,vec[i].Y+1); } } return; } if(f||y>3) return; flip(x,y); vec.PB(MP(x,y)); if(x<3) dfs(x+1,y,state-1); else dfs(0,y+1,state-1); flip(x,y); vec.pop_back(); if(x<3) dfs(x+1,y,state); else dfs(0,y+1,state); return; } void work(){ char s[6]; f=false; vec.clear(); for(int i=0;i<4;i++){ scanf("%s",s); for(int j=0;j<4;j++){ if(s[j]==‘+‘) g[i][j]=0; else g[i][j]=1; } } for(n=1;n<=16;n++){ dfs(0,0,n); if(f) break; } return; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL // init(); work(); return 0; }
以上是关于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