ACM/ICPC 之 枚举(POJ1681-画家问题+POJ1166-拨钟问题)

  POJ1681-画家问题

  枚举的经典例题,枚举第一行即可,其余行唯一。

  1 //画家问题,y表示黄色,w表示白色,怎样让墙上所有方格为y,操作类似熄灯问题poj1222
  2 //memory 136K Time: 297 Ms
  3 #include<iostream>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<cmath>
  7 using namespace std;
  8
  9 #define INF 0x3f3f3f3f
 10 #define MAX 20
 11
 12 char m[MAX][MAX];
 13 int n,ans,sum;
 14 int map[MAX][MAX],cpmap[MAX][MAX],p[MAX];
 15 int move[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
 16
 17 void paint(int x,int y)
 18 {
 19     sum++;
 20     cpmap[x][y] = !cpmap[x][y];
 21     for(int i=0;i<4;i++)
 22     {
 23         int tx = x+move[i][0];
 24         int ty = y+move[i][1];
 25         if(tx>=0 && tx<n && ty>=0 && ty<n)
 26             cpmap[tx][ty] ^= 1;
 27     }
 28 }
 29
 30 /*尝试绘画*/
 31 int test_paint()
 32 {
 33     int i,j;
 34     for(i=0;i<n;i++)    //第一行
 35         if(p[i])
 36             paint(0,i);
 37     for(i=1;i<n;i++)    //其余行唯一
 38     {
 39         for(j=0;j<n;j++)
 40         {
 41             if(!cpmap[i-1][j])
 42                 paint(i,j);
 43         }
 44     }
 45     //判断最后一行是否符合
 46     int flag = 1;
 47     for(i=0;i<n;i++)
 48         if(!cpmap[n-1][i])
 49         {
 50             flag = 0;break;
 51         }
 52     return flag;
 53 }
 54
 55 int main()
 56 {
 57     int T;
 58     int i,j;
 59     scanf("%d",&T);
 60     while(T--)
 61     {
 62         memset(p,0,sizeof(p));
 63         ans = INF;
 64         scanf("%d",&n);
 65         for(i=0;i<n;i++)
 66             scanf("%s",m[i]);
 67         //字符-转换为-0与1
 68         for(i=0;i<n;i++)
 69             for(j=0;j<n;j++)
 70                 if(m[i][j] == ‘y‘)
 71                     map[i][j] = 1;
 72                 else
 73                     map[i][j] = 0;
 74
 75         p[0] = -1;
 76         int res;
 77         while(1)
 78         {
 79             sum = 0;
 80             memcpy(cpmap,map,sizeof(map));
 81             /*二进制枚举第一行所有画法*/
 82             p[0]++;
 83             res = p[0]/2;
 84             j=1;
 85             while(res)
 86             {
 87                 p[j-1] = 0;
 88                 p[j]++;
 89                 res = p[j++]/2;
 90             }
 91             if(p[n])
 92                 break;
 93             if(test_paint())
 94                 if(ans > sum)
 95                     ans = sum;
 96         }
 97         if(ans == INF)
 98             printf("inf\n");
 99         else
100             printf("%d\n",ans);
101     }
102     return 0;
103 }


  POJ1166-拨钟问题

  分析后枚举所有可能情况。

//暴力枚举-熄灯问题变形-拨钟问题,给出九个钟的时针位置(3,6,9,12)-(1,2,3,0)-将他们调到12点 即
//Memory 134K Time: 0 Ms

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int sclock[10];    //source-clock
int pc[10];    //调好后时针位置

int main()
{
    int j;
    for (j = 1; j <= 9; j++)
        scanf("%d",&sclock[j]);
    int i[10];    //枚举所有九种拨法的情况-每种拨法最多3次 (第四次相当于没有拨动)
    //4^9种情况
    for (i[1] = 0; i[1] < 4; i[1]++)
    for (i[2] = 0; i[2] < 4; i[2]++)
    for (i[3] = 0; i[3] < 4; i[3]++)
    for (i[4] = 0; i[4] < 4; i[4]++)
    for (i[5] = 0; i[5] < 4; i[5]++)
    for (i[6] = 0; i[6] < 4; i[6]++)
    for (i[7] = 0; i[7] < 4; i[7]++)
    for (i[8] = 0; i[8] < 4; i[8]++)
        for (i[9] = 0; i[9] < 4; i[9]++)
        {
        pc[1] = (sclock[1] + i[1] + i[2] + i[4]) % 4;
        pc[2] = (sclock[2] + i[1] + i[2] + i[3] + i[5]) % 4;
        pc[3] = (sclock[3] + i[2] + i[3] + i[6]) % 4;
        pc[4] = (sclock[4] + i[1] + i[4] + i[5] + i[7]) % 4;
        pc[5] = (sclock[5] + i[1] + i[3] + i[5] + i[7] + i[9]) % 4;
        pc[6] = (sclock[6] + i[3] + i[5] + i[6] + i[9]) % 4;
        pc[7] = (sclock[7] + i[4] + i[7] + i[8]) % 4;
        pc[8] = (sclock[8] + i[5] + i[7] + i[8] + i[9]) % 4;
        pc[9] = (sclock[9] + i[6] + i[8] + i[9]) % 4;
        int sum = 0;
        for (j = 1; j <= 9; j++)
            sum += pc[j];
        if (!sum)
        {
            for (j = 1; j <= 9;j++)
                while (i[j]--)
                    printf("%d ",j);
            printf("\n");
            return 0;
        }
        }
    return 0;
}
时间: 2024-08-12 05:55:57

ACM/ICPC 之 枚举(POJ1681-画家问题+POJ1166-拨钟问题)的相关文章

2014 ACM/ICPC Asia Regional Guangzhou Online Wang Xifeng&#39;s Little Plot HDU5024

一道好枚举+模拟题目.转换思维视角 这道题是我做的,规模不大N<=100,以为正常DFS搜索,于是傻乎乎的写了起来.各种条件限制模拟过程 但仔细一分析发现对每个点进行全部八个方向的遍历100X100X100^8 .100X100个点,每个点在走的时候8中选择,TLE 于是改为另一个角度: 以符合要求的点为拐弯点,朝两个垂直的方向走,求出最远的距离.这样只要对每个点各个方向的长度知道,组合一下对应的就OK. 避免了每个点深搜. PS:搜索的时候x,y写反了,导致构图出现问题,以后用[dy][dx]

ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L

这套题是我上周日, 就是前天打得一场组队赛, 题目不太好找 题目链接:http://codeforces.com/gym/100861 在virtual judge 上也可以提交哦! A ACM ICPC Rules: 题目大意: 有很多所高校参加预选赛, 并在预选赛取得了排名, 但是对于每所学校, 除了MSU有4个名额之外其他大学只有两个名额( 也就是说, 只有每个大学的前2名进决赛(MSU前四名)&& 最多有10个队伍进入决赛), 高中队伍不能进入决赛. 给出预选赛的排名, 输出可以进

poj 5024&amp;&amp;&amp;2014 ACM/ICPC Asia Regional Guangzhou Online 1003(预处理)

http://acm.hdu.edu.cn/showproblem.php?pid=5024 分析:预处理每个点在八个方向的射线长度,再枚举八种L形状的路,取最大值. 注意题意是求一条最长路,要么一条直线,要么只有一个90角,即L型.其实直线就是L形的一个方向长度为0. 代码: #include<iostream> #include<map> #include<cstdio> #include<string> #include<cstring>

【题解】 2015 ACM/ICPC Asia Regional Shenyang Online

[1006] FangFang (暴力枚举) Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 871    Accepted Submission(s): 364 Problem Description Fang Fang says she wants to be remembered. I promise her.

最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

Question 例题3-5 最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583) 如果x+x的各个数字之和得到y,就是说x是y的生成元.给出n(1<=n<=100000), 求最小生成元.无解输出0.例如,n=216,121,2005时的解分别是198,0,1979. Think 方法一:假设所求生成元记为m,不难发现m<n.换句话说,只需枚举所有的m<n,看看有木有哪个数是n的生成元.此举效率不高,因为每次计算一个n的生成元

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi&#39;an Online) 题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5014 Number Sequence Problem Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● ai ∈ [0,n] ● ai ≠ aj( i ≠ j ) For sequence a and sequ

hdu6206 Apple 2017 ACM/ICPC Asia Regional Qingdao Online

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6206 题目: Apple Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 530    Accepted Submission(s): 172 Problem Description Apple is Taotao's favouri

2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 388    Accepted Submission(s): 212 Problem Description For a number,if the length of continuous odd digits is even and the length