POJ1573(枚举,动态规划)

Flip Game

Time Limit: 1000 MS Memory Limit: 65536 KB

64-bit integer IO format: %I64d , %I64u Java class name: Main

[Submit] [Status] [Discuss]

Description

Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the other one is black and each piece is lying either it‘s black or white side up. Each round you flip 3 to 5 pieces, thus changing the color of their upper side from black to white and vice versa. The pieces to be flipped are chosen every round according to the following rules:

  1. Choose any one of the 16 pieces.
  2. Flip the chosen piece and also all adjacent pieces to the
    left, to the right, to the top, and to the bottom of the chosen piece
    (if there are any).

Consider the following position as an example:

bwbw

wwww

bbwb

bwwb

Here "b" denotes pieces lying their black side up and "w" denotes
pieces lying their white side up. If we choose to flip the 1st piece
from the 3rd row (this choice is shown at the picture), then the field
will become:

bwbw

bwww

wwwb

wwwb

The goal of the game is to flip either all pieces white side up or
all pieces black side up. You are to write a program that will search
for the minimum number of rounds needed to achieve this goal.

Input

The input consists of 4 lines with 4 characters "w" or "b" each that denote game field position.

Output

Write to the output file a single integer
number - the minimum number of rounds needed to achieve the goal of the
game from the given position. If the goal is initially achieved, then
write 0. If it‘s impossible to achieve the goal, then write the word
"Impossible" (without quotes).

Sample Input

bwwb
bbwb
bwwb
bwww

Sample Output

4********************************************************分割线**********************************************************************************************************************************学校竟然把它放到枚举的练习题里,我都惊呆了,不过仔细一想的确是一道枚举的题,但我是用动态规划的思想所以我又把它算是动态规划了,

 1 //动态规划的思想,每一个点都有翻不翻两种情况,复杂度为2^n,需注意的是scanf的问题
 2 #include<stdio.h>
 3 #include<string.h>
 4 using namespace std;
 5 bool chess[6][6]={false};
 6 int step;
 7 bool flag;
 8 int r[5]={-1,1,0,0,0};
 9 int c[5]={0,0,-1,1,0};//(0,0)biaoshizijihenhaoyonga
10 bool isOver(){//jianchashifoujieshu
11     int i,j;
12     for(i=1;i<5;i++)
13         for(j=1;j<5;j++)
14             if(chess[i][j]!=chess[1][1])
15                 return false;
16     return true;
17 }
18 void flip(int row,int col){//反转辞典对应可以翻转的所有点
19     for(int i=0;i<5;i++)
20         chess[row+r[i]][col+c[i]]=!chess[row+r[i]][col+c[i]];
21 }
22 void dfs(int row,int col,int deep){
23     if(deep==step){
24       //  printf("HHH%d==%dflag==%d\n",deep,step,flag);
25         flag=isOver();
26         return ;
27     }
28
29     if(flag||row==5) return ;
30     flip(row,col);//翻转
31     if(col<4) dfs(row,col+1,deep+1);
32     else dfs(row+1,1,deep+1);
33     flip(row,col);
34     if(col<4) dfs(row,col+1,deep);
35     else dfs(row+1,1,deep);
36     return ;
37 }
38 int main()
39 {
40     int i,j;
41     char temp;
42    // memset(chess,0,sizeof(chess));
43     for(int i=1;i<5;i++){
44         for(int j=1;j<5;j++){
45             scanf("%c",&temp);//cin不会接受换行符,但scanf会连换行符一起读入
46             if(temp==‘b‘) chess[i][j]=true;
47         }
48         getchar();
49     }
50     /*for(i=1;i<5;i++)
51     for(j=1;j<5;j++)
52     printf("%d ",chess[i][j]);*/
53     for(step=0;step<=16;step++){//最大是16次翻转,因为16次之后的每次翻转都会造成和不翻那个格子相同的情况。
54         dfs(1,1,0);
55        // printf("STEP=%d\n",step);
56         if(flag) break;
57     }
58     if(flag) printf("%d\n",step);
59     else printf("Impossible\n");
60
61 }

这里是以翻几个棋子为dp线索的,和子集生成好像啊!每一个都是翻不翻,而子集生成是每一个都取不取以个数为线索寻找结束条件。

我暂时理解为暴力,dp,深搜法(我还是个小白啊,会的少,勿怪,暂时对知识点的总结还不是很成熟)

时间: 2024-10-11 18:26:21

POJ1573(枚举,动态规划)的相关文章

区间Dp 暴力枚举+动态规划 Hdu1081

F - 最大子矩形 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located withi

二分二刷-20190205

二分法的时间复杂度:logN 算法面试复杂度: 1.O(1) 不出现 2.o(logN) 二分法 3.o(n^1/2) 分解质因数 4.o(n) 高频 5.o(nlogn) 一般排序 6.O(N^2)数组 枚举 动态规划 7.O(N^3) 数组 枚举 动态规划 8.O(2^n) 与组合有关搜索 9.O(n!) 与排列有关的搜索 https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array

最新Java开发面试题汇总

原文地址:www.jianshu.com/p/faaa4c2a4-前言为了方便之后的面试复习,我把各类面试题给汇总了一下,每道题都是经过自己筛选后觉得需要掌握的,此次整理包括 Java.数据结构与算法.计算机网络.操作系统.数据库等.文末我会把这些完整的答案放送给大家.Java 篇(1). Java基础知识java中==和equals和hashCode的区别int与integer的区别抽象类的意义接口和抽象类的区别能否创建一个包含可变对象的不可变对象?谈谈对java多态的理解String.Str

动态规划和贪婪策略及枚举策略的关系

贪婪策略.枚举策略及动态规划都是常用的算法策略.贪婪策略和动态规划常常用于解决分阶段优化问题,枚举策略则理论上基本可以用于一切优化问题.对于多阶段的优化问题,动态规划是一个重要的算法策略.而使用算法策略的前提是要对该策略有深刻的认识,本文从贪婪策略和动态规划的联系以及枚举策略和动态规划的联系两个方面对动态规划进行分析和理解,并作出总结,动态规划是对贪婪策略和枚举策略之间的一个折衷方法. 我们知道贪婪策略的算法时间复杂度低,因为算法在个阶段作出的决策仅为当前阶段状态下的一个局部极值,这导致算法产生

正整数分组(动态规划,但我用的是枚举)

个人心得:这题其实是一个运用动态规划的题目,将n个整数放在俩个背包里,平均下来就是sum/2,此时找到放在背包中最大的就可以了, 此时相减必然是最小的差.而我根据动态规划一步一步得到最优解的思想,从第一个开始枚举,到第n个数会有2^n个数据太大了,n可取100, 听说n=32,就能买下整个拉斯维加斯了.所以我用了stack和set就排重,本来以为会超时,但没想到过了. 题目: 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差

动态规划之子集枚举

子集枚举DP P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了\(n\)个深埋在地下的宝藏屋, 也给出了这\(n\)个宝藏屋之间可供开发的\(m\)条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多. 小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定. 在此基础

POJ 1050 二维动态规划转变成枚举加一维的动态规划!

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <climits> #include <cstring> #include <cmath> #include <map> #include <set> using namespace s

Codeforces 372B. Counting Rectangles is Fun【动态规划,暴力枚举】(lowbit()小用法)

题目大意: 给出一个由0,1构成的矩阵,询问(a,b)到(c,d)两个点之间的只含有0的矩形有多少个. 方法: 由于矩阵不大,最多40*40,而且询问量很大(10^5)由此我们考虑o(1)输出答案,首先用一个四维数组预处理出答案,最后直接输出即可. 令dp[a][b][c][d]为(a,b)到(c,d)两个点之间的只含有0的矩形的数量, 则递推的公式: dp[a][b][c][d]=dp[a][b][c][d-1]+dp[a][b][c-1][d]-dp[a][b][c-1][d-1] 每次计算

算法整理之动态规划

我现在介绍的这个版本,是从算法爱好者中看到的一个别人的漫画版本.题目:有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶.要求用程序来求出一共有多少种走法.比如,每次走1级台阶,一共走10步,这是其中一种走法.我们可以简写成 1,1,1,1,1,1,1,1,1,1.再比如,每次走2级台阶,一共走5步,这是另一种走法.我们可以简写成 2,2,2,2,2. 分析:这种问题是典型的使用动态规划解决的问题,在使用动态规划的方法之前,能想到的方法可能就是使用排列组合,这是一个非常复