題目
教主上電視了!這個消息絕對是一個爆炸性的新聞。一經傳開,大街上瞬間就沒人了(都回家看電視去了),商店打烊,工廠停業。大家都把電視機的音量開到最大,教主的聲音迴響在大街小巷。
小L給小X慌亂地打開自己家的電視機,發現所有頻道都播放的是教主的採訪節目(-_-bbb)。只見電視屏幕上的教主笑意吟吟,給大家出了一道難題:
一個邊長爲n的大菱形被均勻地劃分成了n*n個邊長爲1的小菱形組成的網格,但是網格中部分邊被抹去了,小L想知道,大菱形內有多少個平行四邊形,這些平行四邊形內不存在邊。
教主說,如果誰寫出了程序,移動用戶請將程序發送到xxxx,聯通用戶請將程序發送到xxxx……如果答對這個題,將有機會參加抽獎,大獎將是教主簽名的Orz教主T-Shirt一件!這個獎品太具有誘惑力了。於是你需要編一個程序完成這麼一道題。
解題思路
我們可以將平行四邊形分成三個部分,
注意A,C的高度相同
我們可以依次求,暴力枚舉。
代碼
#include<cstdio>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=888*3;
int n,s[N][N],ans; char a[N][N];
int pd(int t,int x,int y){return max(s[t][y-1]-s[t][x],0);}
bool check(int x,int y){
int y1=y,y2=y+1,k=1;
while(a[x+1][y1-1]==47&&a[x+1][y2+1]==92&&!pd(x+1,y1-1,y2+1)) y1--,y2++,k++,x++;
if(a[x+1][y1-1]==47&&a[x+1][y2]==47&&!pd(x+1,y1-1,y2)) {
y1--,x++;
while (a[x+1][y1-1]==47&&a[x+1][y2-1]==47&&!pd(x+1,y1-1,y2-1)) y1--,y2--,x++;
y2--;
} else if(a[x+1][y1]==92&&a[x+1][y2+1]==92&&!pd(x+1,y1,y2+1)) {
y2++,x++;
while (a[x+1][y1+1]==92&&a[x+1][y2+1]==92&&!pd(x+1,y1+1,y2+1)) y1++,y2++,x++;
y1++;
}
x++;
rep(i,1,k) if (a[x][y1]==92&&a[x][y2]==47&&!pd(x,y1,y2)) y1++,y2--,x++; else return 0;
return 1;
}
int main(){
scanf("%d",&n); char c=getchar();
rep(i,1,2*n){
int cnt=0;
while ((c=getchar())!='\n'&&c!=EOF) a[i][++cnt]=c;
rep(j,1,2*n) s[i][j]=s[i][j-1]+(a[i][j]==47||a[i][j]==92);
}
rep(i,1,2*n) rep(j,1,2*n) if (a[i][j]==47&&a[i][j+1]==92) ans+=check(i,j);
printf("%d",ans);
}