---
# System prepended metadata

title: 2018. Check if Word Can Be Placed In Crossword
tags: [Leetcode, DFS, Medium]

---

# 2018. Check if Word Can Be Placed In Crossword
###### tags: `Leetcode` `Medium` `DFS`
Link: https://leetcode.com/problems/check-if-word-can-be-placed-in-crossword/
## 思路 $O(4mn*word.length())$ $O(1)$
对于每一个有可能的start point来说我们看四个方向能不能放下这个word 同时还要检查这个方向的首尾是不是符合条件(如果不是边界 就需要```board[i][j]='#'```)
## Code
```cpp=
class Solution {
public:
    bool placeWordInCrossword(vector<vector<char>>& board, string word) {
        int m = board.size(), n = board[0].size();
        int dirs[4][2] = {{0,-1},{1,0},{-1,0},{0,1}};
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(board[i][j]==' ' || board[i][j]==word[0]){
                    for(auto dir:dirs){
                        if(inboard(i-dir[0], j-dir[1], board) && board[i-dir[0]][j-dir[1]]!='#') continue;
                        int nexti = i, nextj = j, len = 0;
                        while(inboard(nexti, nextj, board) && len<word.length()){
                            if(board[nexti][nextj]==' ' || board[nexti][nextj]==word[len]){
                                nexti += dir[0];
                                nextj += dir[1];
                                len++;
                            }
                            else break;
                        }
                        if(len==word.length() && (!inboard(nexti, nextj, board)|| board[nexti][nextj]=='#')) return true;
                    }
                }
            }
        }
        return false;
    }
    bool inboard(int x, int y, vector<vector<char>>& board){
        int m = board.size(), n = board[0].size();
        return x>=0 && x<m && y>=0 && y<n;
    }
};
```