POJ 3251 Big Square

A quite challenging problem,最终看了题解才写出来,惭愧

/*Sample Input

6

J*J***

******

J***J*

******

**B***

******

Sample Output

4

*/

这道题里用到的几种思想还是值得我回味和思考的就是:

1、将复杂的等式用#define代替,不仅简洁而且时间复杂度较低

2、需要在输入的时候加入一个scanf来接收空格键,否则会出错

//这道题目主要是给定一个最大步数,让你输出你在二维空间中可以到达的位置,最后求最大能够形成的面积

#include<cstdio>

#include<iostream>

#include<algorithm>

using namespace std;

#define ok(a,b,c,d) (a>=0&&b>=0&&c>=0&&d>=0)

char map[201][201],enter;

int n,i,j,x,y,p,q,ans;

int main()

{

cin>>n;//输入这是n*n的正方形

for (i=1;i<=n;i++)

{

cin>>enter;//主要是为了吸收回车键(一开始没有注意到)

for (j=1;j<=n;j++)

cin>>map[i][j];

}

for (x=1;x<=n;x++)

for (y=1;y<=n;y++)

if (map[x][y]!=‘B‘)

for (i=n;i>=1;i--)

for(j=n;j>=y;j--)

{

p=i-x;q=j-y;

if (p*p+q*q<=ans)//一开始ans为多少也不知道啊?

continue;

if (map[i][j]==‘B‘||((map[i][j]==map[x][y])&&(map[x][y]!=‘J‘)))

continue;

if (ok(x-q,i-q,y+p,j+p)&&(map[x-q][y+p]==‘J‘)&&(map[i-q][j+p]==‘J‘)||ok(y-p,j-p,i+q,x+q)&&(map[x+q][y-p]==‘J‘)&&(map[i+q][j-p]==‘J‘))

ans=p*p+q*q;

}

printf("%d",ans);

return 0;

}

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421; min-height: 21.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #822d0f }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c81b13 }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c42275 }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px }
span.s1 { }
span.s2 { font: 18.0px Menlo }
span.s3 { color: #c81b13 }
span.s4 { color: #822d0f }
span.s5 { color: #000000 }
span.s6 { color: #703daa }
span.s7 { color: #0435ff }
span.s8 { color: #c42275 }
span.s9 { color: #539aa4 }
span.s10 { font: 18.0px "PingFang SC" }
span.s11 { color: #1e9421 }
span.s12 { font: 18.0px "PingFang SC"; color: #1e9421 }
span.s13 { color: #78492a }
span.s14 { color: #3e1e81 }

时间: 2024-10-28 07:22:03

POJ 3251 Big Square的相关文章

POJ 2362:Square 觉得这才算深度搜索

Square Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 21821   Accepted: 7624 Description Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square? Input The first line of input contains N, the nu

【POJ 1084】 Square Destroyer

[题目链接] http://poj.org/problem?id=1084 [算法] 迭代加深 [代码] #include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #inclu

【POJ】1084 Square Destroyer

1. 题目描述由$n \times n, n \in [1, 5]$的正方形由$2 \times n \times (n+1)$根木棍组成,可能已经有些木棍被破坏,求至少还需破坏多少木根,可以使得不存在任何正方形?2. 基本思路这是一道非常有趣的题目,可以使用IDA*解也可以用DLX解.可以试试5 0这组数据比较两者的性能差异.(1) IDA*使用IDA*处理,是因为最后的解的范围一定不是很大,因为数据很小.至多也就60根木棍.首先可以预处理分别对正方形和木棍进行编号,进而预处理破坏每根木棍可以

poj 1084 Square Destroyer dlx解重复覆盖

分析: 将问题转化为重复覆盖问题,DancingLink解决. 代码: //poj 1084 //sep9 #include <iostream> using namespace std; const int maxN=10024; const int maxL=128; int L[maxN],R[maxN],U[maxN],D[maxN]; int C[maxN],H[maxN]; int S[maxN],A[maxN],X[maxN]; bool makeup[maxL][maxL];

DFS POJ 2362 Square

题目传送门 1 /* 2 DFS:问能否用小棍子组成一个正方形 3 剪枝有3:长的不灵活,先考虑:若根本构不成正方形,直接no:若第一根比边长长,no 4 这题是POJ_1011的精简版:) 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <cstring> 9 #include <map> 10 #include <set> 11 #include <cmath>

(中等) POJ 1084 Square Destroyer , DLX+可重复覆盖。

Description The left figure below shows a complete 3*3 grid made with 2*(3*4) (=24) matchsticks. The lengths of all matchsticks are one. You can find many squares of different sizes in the grid. The size of a square is the length of its side. In the

POJ 1084 Square Destroyer【舞蹈链】【重复覆盖】

建模很容易就能说清楚,但我一直想不出来. 要问为什么的话可能是因为这题要先预处理出来所有正方形,而我没做过要预处理的舞蹈链的题.所以想不到. 那就是预处理出来所有正方形,用一个long long来表示一个正方形,这个正方形有没有包含id这条边就用 (1<<id)&num判断.那怎么预处理所有正方形呢,枚举边长1-n的正方形,然后再枚举这个正方形左上方的顶点就能做出来. 然后就能建模了,火柴是行,所有按现有火柴能拼出来的正方形是列,与其说是精准覆盖倒也可以说是全部破坏. http://e

[DLX重复覆盖] poj 1084 Square Destroyer

题意: n*n的矩形阵(n<=5),由2*n*(n+1)根火柴构成,那么其中会有很多诸如边长为1,为2...为n的正方形,现在可以拿走一些火柴,那么就会有一些正方形被破坏掉. 求在已经拿走一些火柴的情况下,还需要拿走至少多少根火柴可以把所有的正方形都破坏掉. 思路: 对于每个位置遍历所有可能的边长,确定这个边长下的正方形的边对应的都是数字几,并且把正方形从1开始编号. 然后根据编号,把正方形和数字建边记录方便下面建图. 然后以火柴棍为行,正方形为列,建立dancing link 然后求解. 这里

POJ 2362 Square

题意:给n个木棍,问能不能正好拼成一个正方形. 解法:POJ1011的简单版……不需要太多剪枝……随便剪一剪就好了……但是各种写屎来着QAQ 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include&