SPOJ-1895 题解
题意
共有 .
、x
、o
组成的字符矩阵。设矩阵中连续 x
小 A 加一分,连续 o
小 B 加一分。
正文
时间复杂度:
算法:暴力
此题我第一眼看就知道很水(尽管我调试了半天)。
遍历矩阵,对于每格,进行 8 次判断。每次向一个方向连续移动
例子:在
1 2 3 4 5 1 x 2 3 x 4 x 5 x
向左上方向移动一格到 x
,与原格子 x
,与原格子的值相同,继续判断;移到
连续遍历直至找到符合的格子,进行加分,若整个矩阵没有符合条件的格子,则判断平局。
上代码:
#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: 美化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步