#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
#include <bits/stdc++.h>
using namespace std;
/*
问题描述:
给定一个M*N的矩阵,里面有数字1,0。 + 然后给定一个坐标:(x, y)。
请写一个程序计算与坐标x, y值相同,且连通的数字个数。
“连通” 定义为:左右或者上下数值一样则认为这两个块是连通的,连通具有传递性。
输入:matrix, x, y
输出:n
*/
// 判断该点是否已被遍历过或是坐标越界
bool check1(vector<vector<int>>& matrix, vector<vector<bool>>& mask, int x, int y, int value) {
return x >= 0 && y >= 0 && x < matrix.size() && y < matrix[0].size() && matrix[x][y] == value && mask[x][y] != true;
}
// 如果该点未越界且未被遍历过,则统计加1,将其加入队列继续检索
void add(vector<vector<int>>& matrix, vector<vector<bool>>& mask, queue<pair<int, int>>& q, int x, int y, int value, int& result) {
if (check1(matrix, mask, x, y, value)) {
result += 1;
q.push(pair<int, int>{x, y});
mask[x][y] = true;
}
}
int main_1() {
//输入开始
int x = 2;
int y = 2;
vector<vector<int>> matrix{ {1, 0, 1, 0},{1, 0, 0, 0},{1, 1, 0, 1},{0, 1, 0, 1},{1, 1, 0, 0} };
//输入结束
vector<vector<bool>> mask(matrix.size(), vector<bool>(matrix[0].size(), false));
queue <pair<int, int>> q;
int result = 1;
int value = matrix[x][y];
//cout << value << endl;
pair<int, int> temp;
mask[x][y] = true;
q.push(pair<int, int>{x, y});
while (!q.empty()) {
temp = q.front();
q.pop();
add(matrix, mask, q, temp.first, temp.second + 1, value, result);
add(matrix, mask, q, temp.first, temp.second - 1, value, result);
add(matrix, mask, q, temp.first - 1, temp.second, value, result);
add(matrix, mask, q, temp.first + 1, temp.second, value, result);
}
cout << result << endl;
return 0;
}
/*
*
* 0/1矩阵找1的最大连通图 leetcode 200*/
bool check(vector<vector<int>>& matrix, vector<vector<bool>>& mask, int x, int y, int value) {
return x >= 0 && y >= 0 && x < matrix.size() && y < matrix[0].size() && matrix[x][y] == value && mask[x][y] != true;
}
void add_2(vector<vector<int>>& matrix, vector<vector<bool>>& mask, queue<pair<int, int>>& q, int x, int y, int value, int& result,vector<pair<int, int>>& tmp) {
if (check(matrix, mask, x, y, value)) {
result += 1;
q.push(pair<int, int>{x, y});
mask[x][y] = true;
tmp.push_back(pair<int,int>{x,y});
}
}
int numIslands(vector<vector<char>>& grid) {
if(grid.size()==0 || grid[0].size()==0) return 0;
vector<vector<int>> matrix;
for(int i=0;i<grid.size();i++)
{
vector<int> temp;
for(int j=0;j<grid[0].size();j++)
temp.push_back(grid[i][j]-'0');
matrix.push_back(temp);
}
int x = 0;
int y = 0;
vector<vector<bool>> mask(matrix.size(), vector<bool>(matrix[0].size(), false));
int value = 1;
//cout << value << endl;
pair<int, int> temp;
vector<vector<pair<int, int>> > tmp;
int resultnow=0;
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++) {
if(mask[i][j]==true || matrix[i][j]==0) continue;
mask[i][j] = true;
vector<pair<int,int>> now;
now.push_back(pair<int, int>{i,j});
queue <pair<int, int>> q;
q.push(pair<int, int>{i,j});
int result = 1;
while (!q.empty()) {
temp = q.front();
q.pop();
add_2(matrix, mask, q, temp.first, temp.second + 1, value, result, now);
add_2(matrix, mask, q, temp.first, temp.second - 1, value, result, now);
add_2(matrix, mask, q, temp.first - 1, temp.second, value, result, now);
add_2(matrix, mask, q, temp.first + 1, temp.second, value, result, now);
}
// cout<<now.size()<<endl;
resultnow=max(resultnow,result);
tmp.push_back(now);
}
return tmp.size();
}
/*
0/1 矩阵找最大正方形连通图 leetcode 221*/
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.size()==0 || matrix[0].size()==0) return 0;
vector<int>dp(matrix[0].size());
int maxans=0;
for(int i=0;i<matrix.size();i++){
int pre=0;
for(int j=0;j<matrix[0].size();j++){
if(i==0)
{dp[j]=matrix[0][j]-'0';
continue;}
int tmp=dp[j];
if(matrix[i][j]-'0'==1){
dp[j]=min(dp[j],pre);
if(j>=1) dp[j]=min(dp[j],dp[j-1]);
dp[j]++;
}
else dp[j]=0;
pre=tmp;
}
maxans=max(maxans,*max_element(dp.begin(),dp.end()));
}
return maxans*maxans;
}
int main_3(){
vector<vector<string>> matrix{{"1","0","1","0","0"},{"1","0","1","1","1"},{"1","1","1","1","1"},{"1","0","0","1","0"}};
vector<vector<char> > matrixx(matrix.size(),vector<char>(matrix[0].size(),0));
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++)
matrixx[i][j]=matrix[i][j][0];
cout<<maximalSquare(matrixx);
}
/*
最大矩形 leetcode 85*/
int largestRectangleArea(vector<int>& heights)//leetcode 84
{
stack<int> snow;
int len=heights.size();
int ans=0;
for(int i=0;i<len;i++)
{
if(snow.size()==0 || heights[i]>heights[snow.top()])
snow.push(i);
else//如果当前高度比栈顶低,那么说明前面高的就已经能达到最高的宽度了。而这个高度对应的宽度应该是高度*(前一个如果存在就 i-前一个索引号-1 /不存在就是i)
{
while (snow.size()>0 && heights[i]<=heights[snow.top()])//
{
int ding= snow.top();
snow.pop();
int sding;
if(snow.size()==0)sding=i;
else sding=i-snow.top()-1;
ans=max(sding*heights[ding] ,ans);
}
snow.push(i);
}
}
while (snow.size()>0)
{
int ding= snow.top();
snow.pop();
int sding;
if(snow.size()==0) sding=len;
else sding=len-snow.top()-1;
ans=max(sding*heights[ding] ,ans);
}
return ans;
}
int maximalRectangle(vector<vector<char> > &matrix)
{
int now=0;
int w=matrix.size();//行数
if(w==0) return 0;
int h=matrix[0].size();//列数
if(h==0 ) return 0;
//cout<<h<<" "<<w<<endl;
vector<int> ans(h,0);
//cout<<ans.size()<<" "<<ans[0].size()<<endl;
for(int i=0;i<w;i++)
{
for(int j=0;j<h;j++)
{
if(matrix[i][j]=='0') ans[j]=0;
else ans[j]++;
}
int ansnow=largestRectangleArea(ans);
now=max(ansnow,now);
}
return now;
}
int main(){
// main_3();
return 0;
}