POJ 4012
2015-08-18 22:37
267 查看
题目链接:http://poj.org/problem?id=4012
Problem B. Black Square
Input file: black.in
Output file: 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 fireplace. Next morning Peter changed his mind and decided to
restore his painting. He tried to find its remains in the fireplace, and fortunately one of the stripes, namely the k-th from the top, survived the fire. Now Peter wonders whether it is possible to restore the painting based on this stripe. Help him to do it.
Input The first line of the input file 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;
}
Problem B. Black Square
Input file: black.in
Output file: 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 fireplace. Next morning Peter changed his mind and decided to
restore his painting. He tried to find its remains in the fireplace, and fortunately one of the stripes, namely the k-th from the top, survived the fire. Now Peter wonders whether it is possible to restore the painting based on this stripe. Help him to do it.
Input The first line of the input file 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;
}
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- POJ ACM 1001
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- ACM题库以及培养策略
- 排序算法之快速排序
- 网易2018校招题