社区讨论
排版不整齐怎么办?大佬,求助。
站务版参与者 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 条回复,欢迎继续交流。
正在加载回复...