題意是給出400X600的矩陣,不斷在矩陣400X600內劃矩陣,第一次被划過的矩陣地區顏色改變,問的是經過多次劃矩陣後,400X600矩陣內沒有改變顏色的地區,連通地區的塊數和連通地區大小,按照連通地區大小從小到大排序;
思路就是:每次划過的矩陣地區顏色改變(已經變過的不用改變);然後循環圖表;依次搜尋顏色沒變的點;
其中學到了把字串轉化為整數可以用 istringstream;
#include <cstdlib>#include <cctype>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <iostream>#include <sstream>#include <set>#include <queue>#include <stack>#include <ctime>using namespace std;typedef long long ll;#define clr(x,a) memset(x,a,sizeof(x))#define sz(x) (int)x.size()#define see(x) cerr<<#x<<" "<<x<<endl#define se(x) cerr<<" "<<x #define pb push_back#define mp make_pairbool map[400][600];int dx[]={1,-1,0,0},dy[]={0,0,1,-1};int n,m;class grafixMask{ public: vector <int> sortedAreas(vector <string> rectangles) { clr(map,0); int i,j,k; int x1,x2,y1,y2; n=rectangles.size(); for(k=0;k<n;k++) { istringstream L(rectangles[k]); L>>x1>>y1>>x2>>y2; for(i=x1;i<=x2;i++) for(j=y1;j<=y2;j++) { map[i][j]=1; } } vector<int>num; for(i=0;i<400;i++) for(j=0;j<600;j++) if(map[i][j]==0) { int con=0; map[i][j]=1; queue<pair<int,int> >Q; Q.push(make_pair(i,j)); while(!Q.empty()) {con++; int x=Q.front().first,y=Q.front().second; Q.pop(); for(k=0;k<4;k++) { int xx=x+dx[k],yy=y+dy[k]; if(xx>=0&&xx<400&&yy>=0&&yy<600&&map[xx][yy]==0) { map[xx][yy]=1; Q.push(make_pair(xx,yy)); } } } num.push_back(con); } sort(num.begin(),num.end()); return num; } };