答案请无抄袭,仅供参考。
查看原帖
答案请无抄袭,仅供参考。
1691957
guaidaojide1214楼主2025/7/23 13:21
#include<iostream>
using namespace std;
int n,m,k;
int a[1001][1001];//用二维数字数组储存矩阵,0为水,1为船只部分
long long s;
int main()
{
	char c;
	int x;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>c;
			if(c=='#')
			a[i][j]=1;
		}
	}//输入
	/*for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cout<<a[i][j]<<' ';
		}
		cout<<endl;
	}检查输入的矩阵*/
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			int t=0;//表示情况
			if(a[i][j]==1)//a[i][j]处为船只部分
			{
				if(a[i][j+1]==1)//右边有船只
				t=1;
				if(a[i+1][j]==1)//下边有船只
				t+=2;
			}
			else//不是船只部分则跳过
			continue;
			x=0; //记录是否两艘船相互接触
			if(t==0)//点形
			{
				s++;
				//cout<<i<<' '<<j<<endl;检查船只位置
				continue;
			}
			else if(t==1)//横形
			{
				for(int l=j+1;l<=m;l++)
				{
					if(!a[i][l])
					break;//船只部分结束跳出
					else if(a[i-1][l]==1||a[i+1][l]==1)//若上边或下边有其他船只部分
					{
						x=1;
					}
					a[i][l]=0;//判断过了,船只部分变为水
				}
			}
			else if(t==2)//竖形
			{
				for(int l=i+1;l<=n;l++)
				{
					if(!a[l][j])
					break;//船只部分结束跳出
					else if(a[l][j+1]==1||a[l][j-1]==1)//若左边或右边有其他船只部分
					{
						x=1;
					}
					a[l][j]=0;//判断过了,船只部分变为水
				}
			}
			else if(t==3)//方形
			{
				int e=1,f=1;//方形的长与宽
				for(int l=j+1;l<=m;l++)
				{
					if(!a[i][l])
					break;
					else//找长
					f++;
				}
				for(int l=i+1;l<=n;l++)
				{
					if(!a[l][j])
					break;
					else//找宽
					e++;
				}
				for(int l=i;l<=e+i-1;l++)//注意要-1,不然多判断一格,下面也是如此
				{
					for(int r=j;r<=f+j-1;r++)
					{
						if(!a[l][r])//如果有水
						{
							x=1;//两艘船相互接触
							break;
						}
						a[l][r]=0;//判断过了,船只部分变为水
					}
				}
			}
			if(x==1)
			break;
			s++;
			//cout<<i<<' '<<j<<endl;检查船只位置
		}
		if(x==1)
		break;
	} 
	if(x==1)//若出现船只相互接触的情况
	cout<<"Bad placement.";
	else
	cout<<"There are "<<s<<" ships.";
	return 0;
}
2025/7/23 13:21
加载中...