Algorithm Notes

LJXin

记录算法刷题、竞赛思路与编程成长,希望每一篇都讲清楚一点、写扎实一点。

P1101 单词方阵

P1101 单词方阵

原题链接

解题思路

对每个起点 (i, j):
  对每个方向 d(共8个):
            检查从 (i,j) 沿方向 d 能否拼出 "yizhong"
                     若能 → 将这7个格子全部标记为"保留"
最终输出:标记的格子输出原字符,未标记输出 '*'


复杂度分析

  • 时间复杂度:O(n * 2)
  • 空间复杂度:O(n)

代码实现

int n;
string s="yizhong";
int dx[]={-1,0,1,0,-1,-1,1,1};
int dy[]={0,1,0,-1,-1,1,1,-1};
char grid[105][105];
bool keep[105][105];
void solve() {
    cin>>n;
    rep(i,0,n)rep(j,0,n)    cin>>grid[i][j];
    rep(i,0,n){
        rep(j,0,n){
            rep(k,0,8){//8个方向
                bool march=true;
                rep(l,0,7){//7个字母
                    int nx=i+dx[k]*l,ny=j+dy[k]*l;
                    if(nx<0||nx>=n||ny<0||ny>=n||grid[nx][ny]!=s[l]){
                        march=false;
                        break;
                    }
                }
                if(march){
                    rep(l,0,7)keep[i+dx[k]*l][j+dy[k]*l]=true;//标记保留的字母
                }
            }
        }
    }
    rep(i,0,n){
        rep(j,0,n){
            cout<<(keep[i][j] ? grid[i][j] : '*');
        }
        cout<<'\n';
    }

}

posted @ 2026-03-26 21:39  kliu_365  阅读(34)  评论(0)    收藏  举报
TOP