Day4:T3搜索 T4数学题排列组合

T3:搜索

很出名的题吧,费解的开关

同T2一样也是一题很考思考的

附上题解再解释吧:

对于每个状态,算法只需要枚举第一行改变哪些灯的状态,只要第一行的状态固定了,接下来的状态改变方法都是唯一的:每一行需要改变状态的位置都在上一行中不亮的灯的正下面,因为只有这样才能使上一行的灯全亮。我们枚举第一行的状态改变方法(共2^5种),对于每种方法都依次改变下面几行的状态使上面一行灯全亮。到最后一行我们需要判断是否最后一行也恰好全亮,并更新最小步数。

首先需要找到第一行的状态,怎么写?枚举深搜啊

找到了其中一种第一行的状态之后呢?按照题解所说的,改变上一行中不亮的灯的正下面...怎么写?模拟啊不用说了吧

为什么是这样改变?因为需要把状态全部推到最后一行,判断是否可行

之后就是根据思路模拟模拟dfs一下即可了:

var
  a,g:array[0..6,0..6] of longint;
  n,i,j,ans:longint;
  k:char;

procedure huan(x,y:longint);//对(x,y)进行操作
begin
  a[x,y]:=1-a[x,y];
end;

procedure work(x:longint);//开始在第一排的状态已经确定的前提下进行其他行的操作
var
  i,j,k:longint;
begin
  g:=a;//temp数组
  k:=x;//初始值表示已经操作过了几次 当然这个k不总是0
  for i:=1 to 4 do
    for j:=1 to 5 do
      if a[i,j]=0 then
        begin
          huan(i,j);huan(i+1,j);huan(i+2,j);huan(i+1,j-1);huan(i+1,j+1);//将这个点下面一格的灯操作一下
          inc(k);
        end;
  for i:=1 to 5 do
    if a[5,i]=0 then break//如果还有灯是关着的那么就结束.
      else
        if i=5 then
          if k<ans then ans:=k;//如果全部都是开着的那么就更新答案
  a:=g;
end;

procedure cq(x,y:longint);
begin
  if x=6 then work(y)//如果有六个灯了那么就开始找 一开始的初始步骤数为y
    else
      begin
        cq(x+1,y);//找下一个灯
        huan(1,x);huan(1,x-1);huan(2,x);huan(1,x+1);//操作一个灯
        cq(x+1,y+1);//找下一个灯
        huan(1,x);huan(1,x-1);huan(2,x);huan(1,x+1);//回溯~
      end;
end;

begin
  readln(n);
  for n:=n downto 1 do//n可以这样用
    begin
      ans:=7;//用于更新答案(如果可以)
      for i:=1 to 5 do
        begin
          for j:=1 to 5 do
            begin
              read(k);
              a[i,j]:=ord(k)-48;
            end;
          readln;
        end;//读入数据
      cq(1,0);//cq(x,y)表示找第一排的x个灯有y个被操作过的情况(当然是没有重复的)
      if ans<7 then writeln(ans) else writeln(-1);
      readln;
    end;
end.

T4:排列组合

数学题(感觉自己数论方面略弱...需要多练多总结才行)

准备睡觉了...晚安

时间: 2024-10-03 21:28:04

Day4:T3搜索 T4数学题排列组合的相关文章

UVA 12712 Pattern Locker(简单排列组合数学题)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4450 不懂取模运算的请猛戳:http://baike.baidu.com/link?url=A86lTLorv-Mim9g6v8EW3mY98qLz10cot1UCt6TZNPDJyslVYS5Ya1K

HDU 1521 排列组合 搜索

排列组合 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种. Input 每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量. Output 对应每组数据输出排列数.(任何运算不会超出2^31的范围) Sample Input 2 2 1 1 Sa

Codeforces Gym 100187D D. Holidays 排列组合

D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D Description Everyone knows that the battle of Endor is just a myth fabled by George Lucas for promotion of his movie. Actually, no battle of Endor has

排列组合公式

今天在写一个算法的时候用到了排列组合,突然感觉不熟悉了,于是自己搜索了下, 重新复习下,把笔记记下来,便于以后复习. 第一,排列 1)排列的定义,就是指从给定n个数的元素中取出指定r个数的元素,进行排序 2)排列公式 3 公式解读, 总长度为r,第一个人有n-0种选,第二个有n-1种,,,,最后一个有n-(r-1)种(为什么是减去(r-1) 因为到第r个人的时候,发现自己前面有r-1个人已经消耗了r-1个选择了,自己的选择余地变成n-(r-1),这和第一个人发现前面有0个选择已经消耗是一样道理)

HDU 4497 GCD and LCM(分解质因子+排列组合)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满足要求的(x, y, z)有多少组,并且要考虑顺序. 思路:如果L%G != 0显然不存在这样的(x, y, z),相反肯定存在.具体做法就是将L/G分解质因子,得到:L/G = P1^t1 * P2^t2 * ... * Pk^tk,我们来考虑任意一个因子Pi^ti,此时(x/G, y/G, z/

递归求解几类排列组合问题(一、类循环组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. 一.类循环组合排列 Sample Input : 4 2 Sample Output 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 10

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

递归求解几类排列组合问题(三、非重复组合排列)

三.非重复组合排列(含重复数字时,生成不重复组合排列) 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 4 1 2 2 3 Sample Output 1223 1232 1322 2123 2132 2213

第一节.排列组合

总结:什么时候用回溯法? 如果题目要求求出所有满足条件的解,一般来说是用回溯法,记住回溯法的模板,对不同的题目只需要修改这个条件即可. 回溯法的本质是在问题的解空间树上做深度优先搜索(DFS).这节课主要讲了四个排列组合的问题,分别是子集,带重复元素的子集,全排列,带重复元素的全排列.本文分析求子集的问题,给出程序模板.       题目:给定一个含不同整数的集合,返回其所有的子集.       样例: 如果 S = [1,2,3],有如下的解: [ [3], [1], [2], [1,2,3]