# Array# Brute Force# Iteration

f513 - 舉旗遊戲 (Flag)

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個 m x n 的矩陣,矩陣中的每個元素都是 0 或 1。目標是計算矩陣中滿足特定條件的元素的數量。一個元素滿足條件,當且僅當其四個方向的相鄰元素(上、下、左、右)的值都與其自身的值相同。如果元素位於矩陣邊緣,則不存在的相鄰元素不影響判斷。

解題思路

這題的解題思路是遍歷矩陣中的每個元素,並檢查該元素是否滿足題目描述的條件。對於每個元素,我們檢查其上下左右四個相鄰元素的值是否與其自身的值相同。如果所有相鄰元素的值都相同,則將計數器加一。最後,輸出計數器的值。

複雜度分析

  • 時間複雜度: O(m * n)
  • 空間複雜度: O(1)

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
int m,n,a[101][101],ans;
inline int judge(int i,int j,int v){
	if(i<0||j<0||i>=m||j>=n||a[i][j]!=v)return 1;
	return 0;
}
inline int check(int i,int j){
	for(int ii=-1;ii<=1;++ii)
		for(int jj=-1;jj<=1;++jj)
			if(judge(i+ii,j+jj,a[i][j])==0&&(ii!=0||jj!=0))
				return 0;
	return 1;
}
inline int read(){
	int a(0);
	char c('0');
	while(c>='0'){
		a=(a<<3)+(a<<1)+c-'0';
		c=getchar_unlocked();
	}
	return a;
}
inline void write(int x) {
	if(x==0)
		putchar_unlocked('0');
	else{
		int stk[9],*ptr(&stk[0]);
		while(x){*ptr=x%10;x/=10;++ptr;}
		while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
	}
} 
int main(){
	m=read();
	n=read();
	for(int i=0;i<m;++i)
		for(int j=0;j<n;++j)
			a[i][j]=read();
	for(int i=0;i<m;++i)
		for(int j=0;j<n;++j)
			if(check(i,j))
				++ans;
	write(ans);
}

Discussion