POJ 4012

题目链接:http://poj.org/problem?id=4012

Problem B. Black Square

Input ?le: black.in

Output ?le: black.out

Time limit: 3 seconds

Memory limit: 256 megabytes

Inspired by Kazimir Malevich’s masterpiece “Black Square”, Peter Palevich is planning to create his own version. He prepared a rectangular grid containing m×n white cells arranged in m rows of n cells each. Peter painted some of the cells black, so that the
black cells formed a square of size s×s cells. But later that day Peter became disappointed with his painting and destroyed it, cutting it to horizontal stripes of size 1×n and burning them in the ?replace. Next morning Peter changed his mind and decided to
restore his painting. He tried to ?nd its remains in the ?replace, and fortunately one of the stripes, namely the k-th from the top, survived the ?re. Now Peter wonders whether it is possible to restore the painting based on this stripe. Help him to do it.
Input The ?rst line of the input ?le contains four integer numbers: m, n, s and k (1 ≤ m,n ≤ 5000; 1≤ s ≤min(m,n); 1≤ k ≤ m). The second line contains n characters and describes the k-th line of the painting, ‘.’ stands for a white cell, ‘*’ stands for a black
cell. Output If the initial painting can be uniquely restored, output “Unique”. If there are several paintings that could have been painted by Peter, output “Ambiguous”. If there are no possible paintings, output “Impossible”.

Examples

black.in black.out

4 4 1 2 ..*.

Unique

4 4 2 2 ..**

Ambiguous

4 4 3 2 .*.*

Impossible

分类讨论:

首先统计出所给行中black的个数,如果中间有两个black之间有white,则必然impossible,不用再判断了

否则分为以下几种情况:

1. black的个数 == 0:这时说明所给的行为空行,需要判断空行以上和以下能否放下 s*s 的cell,判断是否唯一,多种情况,或者不可能(代码中的judge());

2. black的个数 != s,此时为impossible;

3. blackd个数 == s, 只有一个black块  或者  所给行为第一行 或者 所给行是最后一行 或者  s==m

都是唯一的

4.否则,都是多解

晕~~~~

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int m,n,s,k,flag,black;
int judge(int x)
{
  if(x < s|| n < s) return 0;
  if(x == s && n== s) return 1;
  return 2;
}
int main()
{
    char a[5005];
    while(scanf("%d%d%d%d",&m,&n,&s,&k) !=EOF)
    {
      scanf("%s",a);
      flag = 0;
      black = 0;
      for(int i = 0;i < strlen(a);i ++)
      {
        if(flag == 0)
        {
         if(a[i] == '*')
         {
          black ++;
          flag = 1;
         }
        }
        else if(flag == 1)
        {
          if(a[i] == '*')
          black++;
          else
          flag = 2;
        }
        else if(flag == 2)
        {
         if(a[i] == '*')
         black = -1;
        }
      }
      int up = k-1,down = m-k;
      int ans;
      if(black == 0)
      ans = judge(up) + judge(down);
      else if(black != s)
      ans = 0;
      else if( s==1 || m==s || k==1 || k==m)
      ans = 1;
      else
      ans = 2;

      if(ans == 1)
      printf("Unique\n");
      else if(ans == 0)
      printf("Impossible\n");
      else
      printf("Ambiguous\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 20:29:31

POJ 4012的相关文章

【POJ 3164】【朱刘算法模板】Command Network

Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 13977   Accepted: 4012 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent a

poj 2785 4 Values whose Sum is 0 哈希

题意: 给4个集合ABCD,问有多少种从中各取一个数和为0的方案. 分析: 枚举前两个数建哈希表,枚举后两个数查找即可. 代码: //poj 2785 //sep9 #include <iostream> using namespace std; const int maxN=4012; const int maxM=3999972; int a[maxN],b[maxN],c[maxN],d[maxN]; int hash[maxM+10]; int e; struct Edge { int

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of c

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

POJ 1385 计算几何 多边形重心

链接: http://poj.org/problem?id=1385 题意: 给你一个多边形,求它的重心 题解: 模板题,但是不知道为啥我的结果输出的确是-0.00 -0.00 所以我又写了个 if (ans.x == 0) ans.x = 0 感觉好傻逼 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6

POJ 1741 Tree(树的点分治,入门题)

Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21357   Accepted: 7006 Description Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v)=The min distance between node u and v.Give an in