Description
农夫约翰的N只奶牛排成了一条直线,每只奶牛都有一个特定的标识序号,从左到右第i只奶牛的编号是Bi。
约翰认为他的奶牛队列中存在某段连续区间都是相同序号的,那他的队列就非常的美观。为了创造这样的一个连续区间,约翰决定将某个特定的序号的奶牛全部剔除队列。
问题描述:
请帮助约翰计算出通过选择除去某个特定序号的全部奶牛后,所剩下的队列中连续的有相同序号的奶牛的最大区间。
Input
第一行一个正整数N,表示奶牛的数量。
第2行到第N+1行,每行一个非负整数,表示从左到右每只奶牛的序号。
Output
只有一行一个整数,表示连续的有相同序号的奶牛的最大区间中奶牛的数量。
思路
暴力dfs即可。因为n<=5。
#include<cstdio>
#include<iostream>
using namespace std;
bool B[6][6];
char a[6][6];
int n,l,ans,fx[5]={0,0,+1,-1},fy[5]={+1,-1,0,0};
bool pd(int xx,int yy){
if(B[xx][yy]==1||xx<1||yy<1||xx>n||yy>n) return 0;
return 1;
}
void s(int x,int y,int b,int k){
if(k<0) return;
if(k==0&&b==1){ //走不了啦
ans=max(ans,l+1);
return;
}
B[x][y]=1;
++l; //序列长度
for(int i=0;i<4;++i)
if(pd(x+fx[i],y+fy[i])==1){ //可以走
int mx=x+fx[i],my=y+fy[i];
if(b==1&&a[mx][my]=='(') continue; //如果走不了
else{
if(b==1) s(mx,my,1,k-1); //继续找右括号
else if(b==0&&a[mx][my]=='(') s(mx,my,0,k+1); //继续找左括号
else s(mx,my,1,k-1); //左括号转右括号(这时候减去累计的左括号数)
}
}
--l;
B[x][y]=0;
}
int main(){
scanf("%d",&n);
scanf("%c",&a[1][1]);
for(int i=1;i<=n;++i){ //输入。。。
while(a[i][1]!='('&&a[i][1]!=')') scanf("%c",&a[i][1]);
for(int j=2;j<=n;++j)
scanf("%c",&a[i][j]);
}
if(a[1][1]=='(') s(1,1,0,1); //搜索(目标x坐标,目标y坐标,寻找0左括号/1右括号,已经累计的左括号个数)
printf("%d",ans);
}