最大的矩形
问题描述
在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
输入格式
第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
输出格式
输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6
3 1 6 5 2 3
样例输出
10
n = input()
nnum = int(n)
sq = input()
sqslist = sq.split()
sqlist = []
for sqs in sqslist:
sqn = int(sqs)
sqlist.append(sqn)
sqns = 0
outsqs = 0
for i in range(len(sqlist)):
if sqlist[i] > outsqs:
outsqs = sqlist[i]
for i in range(1,len(sqlist)+1): #遍历矩阵
for j in range(0,len(sqlist)+1-i):
outlist = sqlist[j:j+i]
outlen = len(outlist)
minlen = min(outlist)
numsqs = minlen*outlen
if numsqs > outsqs:
outsqs = numsqs
print(outsqs)
I’m stuck!
问题描述
给定一个R行C列的地图,地图的每一个方格可能是’#‘, ‘+’, ‘-’, ‘|’, ‘.’, ‘S’, ‘T’七个字符中的一个,分别表示如下意思:
‘#’: 任何时候玩家都不能移动到此方格;
‘+’: 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格;
‘-’: 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非’#‘方格移动一格;
‘|’: 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非’#‘方格移动一格;
‘.’: 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为’#’,则玩家不能再移动;
‘S’: 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格;
‘T’: 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。
输入格式
输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个’S’和一个’T’。
输出格式
如果玩家在初始位置就已经不能到达终点了,就输出“I’m stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
样例输入
5 5
--+-+
..|#.
..|##
S-+-T
####.
样例输出
2
样例说明
如果把满足性质的方格在地图上用’X’标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X
package CCF;
import java.util.*;
public class thirteen_five {
public static void main(String args[]) {
Scanner myint = new Scanner(System.in);
int m = myint.nextInt();
int n = myint.nextInt();
strgo[][] all = new strgo[m][n];
int startx = 0,starty = 0;
char c;
for(int i=0;i<m;i++) {
String string = myint.next();
for(int j=0;j<n;j++) {
c = string.charAt(j);
all[i][j] = new strgo();
all[i][j].getit(i, j, c);
if(c == 'S') {
startx = i;
starty = j;
}
}
}
laby mylaby = new laby(all, m, n);
mylaby.changstrgo(all);
gostart(startx,starty,mylaby);
myint.close();
}
static boolean tflag = false;
static ArrayList<Integer> ex = new ArrayList<Integer>();
static ArrayList<Integer> ey = new ArrayList<Integer>();
public static void gonext(laby mylaby,int x,int y) {
mylaby.all[x][y].visited = true;
if(mylaby.all[x][y].c == 'T') {
tflag = true;
}
if(y-1 >= 0 && mylaby.visitleft(mylaby.all[x][y])) {
gonext(mylaby,x,y-1);
}
if(y+1 < mylaby.n && mylaby.visitright(mylaby.all[x][y])) {
gonext(mylaby,x,y+1);
}
if(x-1 >= 0 && mylaby.visitup(mylaby.all[x][y])) {
gonext(mylaby,x-1,y);
}
if(x+1 < mylaby.m && mylaby.visitdown(mylaby.all[x][y])) {
gonext(mylaby,x+1,y);
}
ex.add(x);
ey.add(y);//System.out.println(x+" "+y);
}
public static void gostart(int startx,int starty,laby mylaby) {
mylaby.all[startx][starty].visited = true;
if(mylaby.visitleft(mylaby.all[startx][starty])) {//System.out.println("xxx1");
if(starty-1 >= 0) {
gonext(mylaby,startx,starty-1);
}
}
if(mylaby.visitright(mylaby.all[startx][starty])) {//System.out.println("xxx2");
if(mylaby.n > starty+1) {
gonext(mylaby,startx,starty+1);
}
}
if(mylaby.visitup(mylaby.all[startx][starty])) {//System.out.println("xxx3");
if(startx-1 >= 0) {
gonext(mylaby,startx-1,starty);
}
}
if(mylaby.visitdown(mylaby.all[startx][starty])) {//System.out.println("xxx4");
if(mylaby.m > startx+1) {
gonext(mylaby,startx+1,starty);
}
}
if(tflag) {
int num = 0;
for(int i=0;i<ex.size();i++) {
tflag = false;
mylaby.rebuild();
findway(ex.get(i),ey.get(i),mylaby);
if(!tflag) {
num++;
}
}
System.out.println(num);
}
else {
System.out.println("I'm stuck!");
}
}
public static void findway(int x,int y,laby mylaby) {
mylaby.all[x][y].visited = true;
if(mylaby.all[x][y].c == 'T') {
tflag = true;
return;
}
if(mylaby.visitleft(mylaby.all[x][y])) {
findway(x,y-1,mylaby);
}
if(mylaby.visitright(mylaby.all[x][y])) {
findway(x,y+1,mylaby);
}
if(mylaby.visitup(mylaby.all[x][y])) {
findway(x-1,y,mylaby);
}
if(mylaby.visitdown(mylaby.all[x][y])) {
findway(x+1,y,mylaby);
}
}
}
class laby{
int m,n;
strgo[][] all;
public laby(strgo[][] all,int m,int n) {
this.m = m;
this.n = n;
this.all = all;
}
public void rebuild() {
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
all[i][j].visited = false;
}
}
}
public void changstrgo(strgo[][] all) {
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(i == 0) {
all[i][j].up = false;
}
else {
if(all[i-1][j].c == '#') {
all[i][j].up = false;
}
}
if(i == m-1) {
all[i][j].down = false;
}
else {
if(all[i+1][j].c == '#') {
all[i][j].down = false;
}
}
if(j == 0) {
all[i][j].left = false;
}
else {
if(all[i][j-1].c == '#') {
all[i][j].left = false;
}
}
if(j == n-1) {
all[i][j].right = false;
}
else {
if(all[i][j+1].c == '#') {
all[i][j].right = false;
}
}
}
}
}
public boolean visitleft(strgo itself) {
if(itself.left) {
if(itself.y != 0 && !all[itself.x][itself.y-1].visited) {
return true;
}
}
return false;
}
public boolean visitright(strgo itself) {
if(itself.right) {
if(itself.y != n-1 && !all[itself.x][itself.y+1].visited) {
return true;
}
}
return false;
}
public boolean visitup(strgo itself) {
if(itself.up) {
if(itself.x != 0 && !all[itself.x-1][itself.y].visited) {
return true;
}
}
return false;
}
public boolean visitdown(strgo itself) {
if(itself.down) {
if(itself.x != m-1 && !all[itself.x+1][itself.y].visited) {
return true;
}
}
return false;
}
}
class strgo{
int x,y;
char c;
boolean left = false;
boolean right = false;
boolean up = false;
boolean down = false;
boolean visited = false;
public void getit(int x,int y,char c) {
this.c = c;
this.x = x;
this.y = y;
if(c == 'S' || c == 'T' || c == '+') {
left = true;
right = true;
up = true;
down = true;
}
else if(c == '-') {
left = true;
right = true;
}
else if(c == '|') {
up = true;
down = true;
}
else if(c == '.') {
down = true;
}
}
}