四叹寂寞太凄苦,闲|

IOIAK_wanguan

园龄:2年5个月粉丝:2关注:0

📂题解
🔖SPOJ
2022-09-19 21:49阅读: 35评论: 0推荐: 0

SPOJ-1895 题解

题意

共有 tn×m 的由 .xo 组成的字符矩阵。设矩阵中连续 k 格为 x 小 A 加一分,连续 k 格为 o 小 B 加一分。

正文

时间复杂度:O(tnmk)

算法:暴力

此题我第一眼看就知道很水(尽管我调试了半天)。

遍历矩阵,对于每格,进行 8 次判断。每次向一个方向连续移动 k1 格,每次判断移到的格子是否与原格子相同,若不同,终止此次判断。

例子:在 (5,5) 向左上方向检查,判断是否有 5 子相连。

1 2 3 4 5
1 x
2
3 x
4 x
5 x

向左上方向移动一格到 (4,4),读取 (4,4) 的值为 x,与原格子 (5,5) 的值相同,继续判断;再向左上方移动一格到 (3,3),读取 (3,3) 的值为 x,与原格子的值相同,继续判断;移到 (2,2),发现 (2,2) 的值与原格子不符,表明例子条件下并没有 5 子相连。

连续遍历直至找到符合的格子,进行加分,若整个矩阵没有符合条件的格子,则判断平局。

上代码:

#include<bits/stdc++.h>
using namespace std;
using gg=long long;
gg t;
gg n,m,k;
gg mp[1000][1000];//储存矩阵
gg pts[3];
gg q;
bool f(gg x,gg y,gg x_,gg y_,gg k){
//之前看一位大佬用了较多个dfs,感觉有点麻烦,x_和y_控制判断的方向
q=mp[x][y];//读取原格子的值
if(q==0){
return false;
}
for(gg i=1;i<k;i++){
if(x+x_*(k-1)>=0 && x+x_*(k-1)<=n &&
y+y_*(k-1)>=0 && y+y_*(k-1)<=m){//判断是否会越界
if(mp[x+x_*i][y+y_*i]!=q)
return false;
}
else
return false;
}
return true;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>t;
for(gg i=1;i<=t;i++){
cin>>m>>n>>k;
memset(mp,0,sizeof mp);//初始化
for(gg j=1;j<=n;j++){
for(gg l=1;l<=m;l++){
char c;
cin>>c;//将字符转换成整形值输入,方便
mp[j][l]=(c=='.'?0:(c=='x'?1:2));
}
}
for(gg j=1;j<=n;j++){
for(gg l=1;l<=m;l++){
if(f(j,l,1,0,k) || f(j,l,1,1,k) ||
f(j,l,0,1,k) || f(j,l,-1,0,k) ||
f(j,l,0,-1,k) || f(j,l,-1,-1,k) ||
f(j,l,1,-1,k) || f(j,l,-1,1,k)){//连续判断
pts[q]++;
goto end_;//一些厌恶goto的轻喷,但不得不说真的方便
}
}
}
end_: ;
}
cout<<pts[1]<<':'<<pts[2];
return 0;//虽然代码看着有点长,但本蒟蒻觉得是比较好理解的吧
}

洛谷提交记录,华丽结束。

后附

日志

v1.9 on 2022.09.03: 改正
v2.1 on 2022.09.24: 美化

本文作者:wanguan

本文链接:https://www.cnblogs.com/wanguan/p/16694709.html

版权声明:本作品采用 BY-NC-SA 4.0 许可协议进行许可。

posted @   IOIAK_wanguan  阅读(35)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起