P8546题解
P8546 小挖的 X 献身
题面:
题目传送门 (请看题面后食用此题解)
题意注意事项:
题目要求输出 “01”矩阵中由 “1” 组成的 “X” 形数量,关于 “X” 的要求题面有举例描述,值得注意的是单个的 “1” 不属于 “X” 形的范畴。
思路:
关于此题思路无外乎两点:如何判断 “X” 形和如何避免重复。
-
如何判断 “X” 形?
如果你仔细阅读题面的样例就会发现,一个 “X” 形的长宽是一致的。 所以只需要知道一个 “X” 形的左右上角的两个 “1” ,整个 “X” 就可以被确定。所以遍历同一行的 “1” 即可。
- 如何避免重复?
我们假象一个 “X” 形对应一个正方形,那么保证所有的正方形不重复即可。那么很容易想到,针对一个 “1” ,对其右下方所有可能符合条件的正方形进行判断,即使全部可行,也不会与之前的情况重复,因为之前的情况一定包含这个 “1” 的左方和上方部分。
代码逻辑:
既然已经解决了以上两个问题,就可以开始构建代码了。伪代码如下:
#include<头文件>
using namespace std;
判断函数()
{
if(确实是"X")
答案更新
}
int main()
{
读入;
for(遍历每一行)
for(遍历每一列)
if(此格为'1')
for(遍历与此‘1’同行的每一个‘1’)
调用判断函数;
输出;
return 0;
}
Code:
#include<cstdio>
#include<iostream>//杜绝万能头,从我做起(雾
using namespace std;
int n,mp[101][101];
char ch;
int ans;//记录答案
void pd(int i,int j,int k)
{
if(n-i < k-j)
return;
//cout<<i<<endl;
int x1 = i;
int y1 = j;
int y2 = k;
for(int u = 1 ; u< k-j+1 ; u++)
{
x1++;
y1++;
i++;
y2--;
if(mp[x1][y1] == 0)return;
if(mp[i][y2] == 0)return;
}//遍历“X”形,判断是否全为1,否则return
ans++;
}
int main()
{
scanf("%d",&n);
for(int i = 1 ; i<= n ; i++ )
{
for(int j = 1 ; j<= n ; j++)
{
cin>>ch;
mp[i][j] = ch-'0';
}
}
//读入
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
if(mp[i][j] == 1)
{
for(int k = j+1; k <= n ; k++)
{
if(mp[i][k] == 1)
{
pd(i,j,k);
}
}
}
}
}//遍历并判断,记录答案
printf("%d",ans);//输出
return 0;//轻松结束,撒花!
}
后记:
好久没写题解了,有什么问题请见谅。管理给个“过”,路过给个赞????~WAW