样例错,求助,玄关
查看原帖
样例错,求助,玄关
806330
LinkCatTree楼主2023/9/25 16:20

P3671

#include <bits/stdc++.h>
using namespace std;
char a[25][25];
int n,I[50005],J[50005],P[50005],Q[50005];
int cnt,how[3],cc[3];
bool yes[128],vis[25][25];
void dfs(int x,int y) {
	vis[x][y]=true;
	if(x>1&&a[x-1][y]==a[x][y]&&!vis[x-1][y]) dfs(x-1,y);
	if(y>1&&a[x][y-1]==a[x][y]&&!vis[x][y-1]) dfs(x,y-1);
	if(x<n&&a[x+1][y]==a[x][y]&&!vis[x+1][y]) dfs(x+1,y);
	if(y<n&&a[x][y+1]==a[x][y]&&!vis[x][y+1]) dfs(x,y+1);
	return ;
}
bool check(int i,int j,int p,int q) {
	memset(yes,false,sizeof(yes));
	int col=0;
	for(int x=i;x<=p;x++)
		for(int y=j;y<=q;y++)
			if(!yes[a[i][j]]) {
				yes[a[i][j]]=true,col++;
				if(col>2) return false;
				cc[col]=a[i][j];
			}
	if(col<2) return false;
	memset(vis,false,sizeof(vis));
	memset(how,0,sizeof(how));
	for(int x=i;x<=p;x++)
		for(int y=j;y<=q;y++)
			if(!vis[x][y]) {
				dfs(x,y);
				if(a[x][y]==cc[1]) how[1]++;
				else how[2]++;
			}
	if((how[1]==1&&how[2]!=1)||(how[1]!=1&&how[2]==1)) return true;
	return false;
}
bool rightans(int p) {
	for(int i=1;i<=cnt;i++)
		if(i!=p&&I[i]<=I[p]&&J[i]<=J[p]&&P[i]>=P[p]&&Q[i]>=Q[p])
			return false;
	return true;
}
int main() {
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int p=i;p<=n;p++)
				for(int q=j;q<=n;q++)
					if(check(i,j,p,q)) {
						++cnt;
						I[cnt]=i,J[cnt]=j;
						P[cnt]=p,Q[cnt]=q;
					}
	int ans=0;
	for(int i=1;i<=cnt;i++)
		if(rightans(i)) ans++;
	cout<<ans<<endl;
	return 0;
}
2023/9/25 16:20
加载中...