社区讨论

排版不整齐怎么办?大佬,求助。

站务版参与者 6已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@mi7psymv
此快照首次捕获于
2025/11/21 01:38
4 个月前
此快照最后确认于
2025/11/21 01:38
4 个月前
查看原帖

总的大致思路:

第一

先找找图形里是否有不合规则的(不是四边形)

第二

图形#数目不可能为三。

假设 如图:

##
##

(1,1) 找到的有: 自身

1个

(1,2) 找到的有: 自身 (1,1)

2个

(2,1) 找到的有: 自身 (1,1)

2个

(2,2) 找到的有: 自身 (1,1)(1,2)(2,1)

4个

所以四边形不可能找到三个。

顺便说一下:(可以用 x-1 x+1 都可以,但要对称。)

第三

找到一个#,为一组加一。但要让这一组的#全部消失,避免组计算的重复。

第四

若没有#出现,便得出组数。

非常重要一点 !!!谨记!!! 输出一定带标点,标点不要离字母太远。

代码如下:

#include <bits/stdc++.h>

using namespace std;

int const maxn=1100;

int R,C,cnt;

char ju[maxn][maxn];

int a[maxn*maxn][3];

int dx[5]={0,0,-1,0,1};

int dy[5]={0,-1,0,1,0};

void init()

{
CPP
 cin>>R>>C;
 for(int i=1;i<=R;i++)
 for(int j=1;j<=C;j++)
{
 cin>>ju[i][j];
} 
}

int pd(int x,int y)

{
CPP
  int num=0;
 
  if(ju[x][y]=='#') num++;
  
  if(ju[x-1][y]=='#') num++;
 
  if(ju[x-1][y-1]=='#') num++;
 
  if(ju[x][y-1]=='#') num++;
 
  if(num==3) return 0;

  return 1;
}

void bfs(int x1,int y1)

{
CPP
  cnt++;  **//找到一组;**
 
  int head, tail;
  
  a[1][1]=x1;
 
  a[1][2]=y1;
 
  head=0;
 
  tail=1;
 
  do
{
  head++;
 
  for(int i=1;i<=4;i++)
 
 {
  int x,y;
 
  x=a[head][1]+dx[i];  //四边搜索 


  y=a[head][2]+dy[i];
  
  if(ju[x][y]!='.'&&x>0&&x<=R&&y>0&&y<=C)
 
{
  tail++;
 
  a[tail][1]=x;
 
  a[tail][2]=y;
 
  ju[x][y]='.';  //与#相连的为一组,找到了就让它变为‘.’。


}
}
} while(head<tail);
}

int main()

{
CPP
  init(); //填数

  for(int i=1;i<=R;i++)
{
  for(int j=1;j<=C;j++)
  
  if(i<=R&&j<=C&&pd(i,j)==0) //搜索寻找是否有不是四边形的#
{
  cout<<"Bad placement."<<endl;
  
  return 0;
}
}
  for(int i=1;i<=R;i++)
{
  for(int j=1;j<=C;j++)
  
  if(ju[i][j]!='.') //找# (上面的代码排除了不合规则的情况,说明下面都是#都是四边形)
{
  bfs(i,j);
}
}
  cout<<"There are "<<cnt<<" ships."<<endl;
  
  return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...