#模擬#[jzoj 1404] 菱形內的計數

題目

教主上電視了!這個消息絕對是一個爆炸性的新聞。一經傳開,大街上瞬間就沒人了(都回家看電視去了),商店打烊,工廠停業。大家都把電視機的音量開到最大,教主的聲音迴響在大街小巷。
  小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); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章