Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<queue>
- using namespace std;
- int n;
- int board[20][20];
- bool visited[20][20];
- void clearvisited(){
- for(int i = 0 ; i < 20 ; i ++)for(int j = 0 ; j < 20 ; j ++)visited[i][j] = false;
- }
- struct pos{
- int I,J;
- };
- int moveI[4] = {-1,0,1,0};
- int moveJ[4] = {0,1,0,-1};
- bool IsInB(int I,int N){
- return (0 <= I && I < N);
- }
- int cntcom(int I,int J){
- int key = board[I][J];
- queue<pos> q;
- clearvisited();
- int cnt = 0;
- q.push({I,J});
- while(!q.empty()){
- int uI = q.front().I;
- int uJ = q.front().J;
- q.pop();
- if(visited[uI][uJ])continue;
- cnt ++;
- visited[uI][uJ] = true;
- for(int i = 0 ; i < 4 ; i ++){
- int vI = uI + moveI[i];
- int vJ = uJ + moveJ[i];
- if(IsInB(vI,n) && IsInB(vJ,n) && !visited[vI][vJ] && board[vI][vJ] == key){
- q.push({vI,vJ});
- }
- }
- }
- return cnt;
- }
- void erase(int I,int J){
- int key = board[I][J];
- queue<pos> q;
- clearvisited();
- q.push({I,J});
- while(!q.empty()){
- int uI = q.front().I;
- int uJ = q.front().J;
- q.pop();
- if(visited[uI][uJ])continue;
- board[uI][uJ] = 0;
- visited[uI][uJ] = true;
- for(int i = 0 ; i < 4 ; i ++){
- int vI = uI + moveI[i];
- int vJ = uJ + moveJ[i];
- if(IsInB(vI,n) && IsInB(vJ,n) && !visited[vI][vJ] && board[vI][vJ] == key){
- q.push({vI,vJ});
- }
- }
- }
- }
- bool minicheck(int I,int J){
- int key = board[I][J];
- int TypeA1I[4] = {0,-1,0,-1};
- int TypeA1J[4] = {1,0,-1,0};
- int TypeA2I[4] = {1,0,1,0};
- int TypeA2J[4] = {0,-1,0,1};
- for(int i = 0 ; i < 4 ; i ++){
- pos A1;
- pos A2;
- A1.I = I + TypeA1I[i];
- A1.J = J + TypeA1J[i];
- A2.I = I + TypeA2I[i];
- A2.J = J + TypeA2J[i];
- if(IsInB(A1.I,n) && IsInB(A1.J,n) && IsInB(A2.I,n) && IsInB(A2.J,n)){
- if(board[I][J] == board[A1.I][A1.J] && board[I][J] == board[A2.I][A2.J])return true;
- }
- }
- return false;
- }
- int check(int I,int J){
- int key = board[I][J];
- queue<pos> q;
- clearvisited();
- q.push({I,J});
- pos arr[3];
- int idx = 0;
- while(!q.empty()){
- int uI = q.front().I;
- int uJ = q.front().J;
- q.pop();
- if(visited[uI][uJ])continue;
- arr[idx++] = {uI,uJ};
- visited[uI][uJ] = true;
- for(int i = 0 ; i < 4 ; i ++){
- int vI = uI + moveI[i];
- int vJ = uJ + moveJ[i];
- if(IsInB(vI,n) && IsInB(vJ,n) && !visited[vI][vJ] && board[vI][vJ] == key){
- q.push({vI,vJ});
- }
- }
- }
- for(int i = 0 ; i < 3 ; i ++){
- if(minicheck(arr[i].I,arr[i].J))return 1;
- }
- return 0;
- }
- int main()
- {
- scanf("%d",&n);
- for(int i = 0 ; i < n ; i ++){
- for(int j = 0 ; j < n ; j ++){
- scanf("%d",&board[i][j]);
- }
- }
- int ans = 0;
- for(int i = 0 ; i < n ; i ++){
- for(int j = 0 ; j < n ; j ++){
- if(board[i][j] == 0)continue;
- if(cntcom(i,j) != 3){
- erase(i,j);
- continue;
- }
- else{
- ans += check(i,j);
- erase(i,j);
- }
- }
- }
- printf("%d",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement