首页 > 其他 > 详细

[POJ]POJ2965(dfs)

时间:2018-12-21 18:35:37      阅读:144      评论:0      收藏:0      [点我收藏+]
题意:给出一个4*4的01方阵,每次可选择i,j使第i行和第j列状态取反,求全变成0的最小步数。

显然每个坐标最多选择一次,因此最多有2^16种选法,枚举最小步数dfs即可。

#include <cstdio> #include<iostream> #include<algorithm> using namespace std; typedef long long int LL; #define st first #define nd second #define pb push_back #define mp make_pair #define pll pair <LL, LL> #define pii pair <int, int> #define rep(i,x) for(int i=1;i<=x;i++) const int N = 1e5+7; const int MX = 1e9+7; const LL INF = 1e18+9LL; char a[6][6]; int ans[20]; int check(){ rep(i,4) rep(j,4)if(a[i][j]==‘+‘)return 0; return 1; } void make(int x,int y){ rep(i,4)a[x][i]=(a[x][i]==‘+‘? ‘-‘:‘+‘); rep(i,4)a[i][y]=(a[i][y]==‘+‘? ‘-‘:‘+‘); a[x][y]=(a[x][y]==‘+‘? ‘-‘:‘+‘); } int dfs(int s,int x,int y){ if(!s||x>4)return check(); if(4*(4-x)+5-y<s)return 0; int f; if(y<4){ f=dfs(s,x,y+1); if(f)return 1; make(x,y); f=dfs(s-1,x,y+1); if(f)ans[s]=x*10+y; make(x,y); return f; } else { f=dfs(s,x+1,1); if(f)return 1; make(x,y); f=dfs(s-1,x+1,1); if(f)ans[s]=x*10+y; make(x,y); return f; } } int main(){ rep(i,4)scanf("%s",a[i]+1); for(int i=0;i<=16;i++){ if(dfs(i,1,1)){ cout<<i<<endl; for(int j=i;j>=1;j--){ cout<<ans[j]/10<<" "<<ans[j]%10<<endl; } return 0; } } return 0; }

[POJ]POJ2965(dfs)

原文:https://www.cnblogs.com/xutianshu/p/10157415.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!