标签:
以为求有几个连通块,~~这都A了5个点
#include<cstdio> #include<iostream> using namespace std; char map[110][110]; int n,m,ans,vis[110][110]; void dfs(int i,int j){ if(i<1||j<1||i>n||j>m) return ; if(vis[i][j]) return ; if(!vis[i][j]){ vis[i][j]=1; if(map[i][j]==‘#‘){ int f1=0,f2=0,f3=0,f4=0; if((map[i+1][j]==‘#‘&&!vis[i+1][j])||map[i+1][j]!=‘#‘) f1=1; if((map[i-1][j]==‘#‘&&!vis[i-1][j])||map[i-1][j]!=‘#‘) f2=1; if((map[i][j+1]==‘#‘&&!vis[i][j+1])||map[i][j+1]!=‘#‘) f3=1; if((map[i][j-1]==‘#‘&&!vis[i][j-1])||map[i][j-1]!=‘#‘) f4=1; if(f1&&f2&&f3&&f4) ans++; } } dfs(i+1,j); dfs(i,j+1); dfs(i-1,j); dfs(i,j-1); } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>map[i][j]; dfs(1,1); if(ans) printf("There are %d ships.\n",ans); else printf("Bad placement.\n"); return 0; }
读明白题目了,dfs却超时
#include<cstdio> #include<iostream> using namespace std; const int dx[2]={0,1}; const int dy[2]={1,0}; char map[1010][1010]; int n,m,ans,vis[1010][1010]; int flag; void dfs(int i,int j,int num){ if(i<1||j<1||i>n||j>m||flag) return ; if(vis[i][j]&&vis[i][j]!=num){flag=1;return ;} vis[i][j]=num; for(int k=0;k<2;k++){ int x=i+dx[k],y=j+dy[k]; if(map[x][y]==‘#‘&&vis[x][y]>=0){ dfs(x,y,num); } } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>map[i][j]; for(int i=1;i<=n&&!flag;i++){ for(int j=1;j<=m&&!flag;j++){ if(map[i][j]==‘#‘&&map[i+1][j]==‘#‘&&map[i][j+1]==‘#‘) if((map[i+1][j+1]==‘#‘||map[i-1][j-1]==‘#‘||map[i+1][j-1]==‘#‘||map[i-1][j+1]==‘#‘)); else{ flag=1;break; } if(map[i][j]==‘#‘&&!vis[i][j]){ ans++; dfs(i,j,ans); } } } if(!flag) printf("There are %d ships.\n",ans); else printf("Bad placement.\n"); return 0; }
去网上搜了一下,大多用bfs过,跟一下
题解:
虽然说是一道白银,但是我刚看到的时候还是要有思路啊!!
遍历矩阵,找一个没到过的格子(xx,yy)作为当前矩形的左上角,开始BFS,如果过程中出现x< xx||y< yy的话就是不可能的(手画一下就可以看出),如果没有出现这样的情况,就记录x坐标,y坐标的最大值maxx,maxy,然后记录一下到过的格子数cnt,如果cnt==(maxx-xx+1)*(maxy-yy+1)说明这个矩形是满的,当前矩形符合要求,一个一个找就行了
AC代码:
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 1010 const int dx[]={-1,0,1,0}; const int dy[]={0,1,0,-1}; char map[N][N]; int vis[N][N],n,m; struct node{ int x,y; node(int x=0,int y=0):x(x),y(y){} }; int inside(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;} int bfs(int xx,int yy){ int maxx=xx,maxy=yy,cnt=0; queue<node>q; q.push(node(xx,yy)); vis[xx][yy]=1; while(!q.empty()){ node k=q.front();q.pop(); cnt++; for(int i=0;i<4;i++){ int nx=k.x+dx[i],ny=k.y+dy[i]; if(inside(nx,ny)&&map[nx][ny]==‘#‘&&!vis[nx][ny]){ vis[nx][ny]=1; maxx=max(maxx,nx); maxy=max(maxy,ny); q.push(node(nx,ny)); if(nx<xx||ny<yy) return 0; } } } if(cnt==(maxx-xx+1)*(maxy-yy+1)) return 1; return 0; } int main() { cin>>n>>m; int cnt=0; for(int i=1;i<=n;i++)scanf("%s",map[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!vis[i][j]&&map[i][j]==‘#‘) if(!bfs(i,j)){ printf("Bad placement.\n");return 0; } else cnt++; printf("There are %d ships.",cnt); return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5583276.html