洛谷P1101 单词方阵
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1101 单词方阵
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一道簡單的利用dfs思想解決的水題,寫這篇文章只是為了懺悔為什么疫情在家學習的時候沒有好好學習數據結構以及大二沒有好好寫過題,導致快大四了還要重頭學數據結構(感謝我的老師讓我數據結構飄過)
這道題我大一上學期還沒開擺的時候就看過了,那時候數據結構、算法什么的基本一竅不通,只會一些簡單的c語言,連期末考試那道簡單的遞歸題目都做不出來orz
到了大三下學期,重新看這道題,覺得是如此的簡單...實在是為當初的擺爛后悔不已..也希望看到這篇文章的學弟學妹們不管是什么專業的,都要好好學習,是軟件/計算機專業的要好好學數據結構和算法,別等到大三了才來后悔,不要因為一時的困難就擺爛,擺爛是解決不了任何問題的
主要思想:用一個隊列保存矩陣里所有字符'y'的位置,然后依次出隊用dfs走迷宮的思想去判斷八個不同方向的字符串能否構成'yizhong'
完整代碼:
#include <iostream> #include <queue> typedef std::pair<int, int> pair;int n; char arr[105][105]; char ans[105][105];/*用字符矩陣保存結果,可不用字符矩陣,即使用bool矩陣判斷即可*/ const char* ch = "yizhong"; std::queue<pair> q; /*八個不同的方向判斷是否能構成'yizhong'這個字符串*/ int dx[8] = { -1,1,0,0,-1,-1,1,1 }; int dy[8] = { 0,0,-1,1,-1,1,-1,1 };int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cin >> n;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {std::cin >> arr[i][j];if (arr[i][j] == 'y') q.push(pair(i, j));}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {ans[i][j] = '*';}}int k;int flag;while (!q.empty()) {pair p = q.front(); q.pop();for (int i = 0; i < 8; i++) {k = 1;/*flag存儲哪個方向的字符串可以匹配給定字符串*/flag = i;int nx = p.first;int ny = p.second;/*'y'已經是判斷好的了,只需要判斷'izhong'即可*/for (int j = 0; j < 6; j++) {nx += dx[i];ny += dy[i];/*如果當前字符匹配則繼續進行下一個字符匹配*/if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && arr[nx][ny] == ch[k]) k++;/*如果當前字符不匹配則設置flag為-1*/else if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && arr[nx][ny] != ch[k]) {flag = -1;break;}/*其他情況*/else {flag = -1;break;}}/*找到哪個方向可以之后就設置ans矩陣*/if (flag != -1) {int c = 1;ans[p.first][p.second] = 'y';int nx = p.first;int ny = p.second;for (int j = 0; j < 6; j++) {nx += dx[flag];ny += dy[flag];ans[nx][ny] = ch[c];c++;}}}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {printf("%c", ans[i][j]);}printf("\n");}return 0; }總結
以上是生活随笔為你收集整理的洛谷P1101 单词方阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps手柄震动测试软件,PS3 可实现震动
- 下一篇: 设置为首页,加入收藏 | JS完美实现代