Almost Rectangle

题目

There is a square field of size n×n in which two cells are marked. These cells can be in the same row or column.

You are to mark two more cells so that they are the corners of a rectangle with sides parallel to the coordinate axes.

For example, if n=4 and a rectangular field looks like this (there are asterisks in the marked cells):

…∗.

∗…

Then you can mark two more cells as follows

∗.∗.

∗.∗.

If there are several possible solutions, then print any of them.

Input
The first line contains a single integer t (1≤t≤400). Then t test cases follow.

The first row of each test case contains a single integer n (2≤n≤400) — the number of rows and columns in the table.

The following n lines each contain n characters ‘.’ or ‘*’ denoting empty and marked cells, respectively.

It is guaranteed that the sums of n for all test cases do not exceed 400.

It is guaranteed that there are exactly two asterisks on the field. They can be in the same row/column.

It is guaranteed that the solution exists.

Output
For each test case, output n rows of n characters — a field with four asterisks marked corresponding to the statements. If there multiple correct answers, print any of them.

样例输入

Example
Input
6
4
.



2
.
.

2
.

.

3
.


5



.


4


*…
*…

样例格式

Output
..

..

**
**
**
**
.
.


.

.




**…
**…

数据范围

不大于400

题意

每个矩阵里有两个星号,再添加两个星号,使四个星号组成一个矩阵

思路

  • 1.给的两个星号不同行不同列的情况
  • 2.给的两个星号同行不同列,在第一行和最后一行的情况
  • 3.给的两个星号不同行同列,在第一列和最后一列的情况

坑点

  • 1.给的两个星号同行不同列,在第一行和最后一行的情况
  • 2.给的两个星号不同行同列,在第一列和最后一列的情况

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int k;
	cin>>k;
	while(k--)
	{
		int n;
		char num[405][405];
		cin>>n;
		int a,b,c,d;
		bool t=0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				cin>>num[i][j];
				if(num[i][j]=='*'&&t==0)
				{
					a=i;
					b=j;
					t=1;
				}
				if(num[i][j]=='*'&&t==1)
				{
					c=i;
					d=j;
				}
			}
		}
		if(n==2)
		{
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					cout<<'*';
				}
				cout<<endl;
			}
			
		}
		else
		{
			if(a!=c&&b!=d)
			{
				num[a][d]='*';
				num[c][b]='*';
				
			}
			else if(a==c&&b!=d&&a!=n-1)
			{
				num[a+1][d]='*';
				num[c+1][b]='*';
			}
			else if(a==c&&b!=d&&a==n-1)
			{
				num[a-1][d]='*';
				num[c-1][b]='*';
			}
			else if(a!=c&&b==d&&b!=n-1)
			{
				num[a][d+1]='*';
				num[c][b+1]='*';
			}
			else if(a!=c&&b==d&&b==n-1)
			{
				num[a][d-1]='*';
				num[c][b-1]='*';
			}
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					cout<<num[i][j];
				}
				cout<<endl;
			}
		}
	}
		
	return 0;
}

总结

用scanf和printf输入输出会比cin,cout快

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值