Red and Black (找到一个标记一个)
生活随笔
收集整理的這篇文章主要介紹了
Red and Black (找到一个标记一个)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://poj.org/problem?id=1979
?
題目大意:
有一個長方形的房間,上面鋪著正方形的瓷磚。每塊瓷磚都是紅色或黑色的。一個男人站在一塊黑色的瓷磚上。從一個瓦片,他可以移動到四個相鄰瓦片中的一個。但是他不能在紅瓦上移動,他只能在黑瓦上移動。
?
編寫一個程序,通過重復上面描述的動作來計算他可以到達的黑色方塊的數量。
輸入
輸入由多個數據集組成。數據集以包含兩個正整數W和H的行開始;W和H分別是x和y方向上的瓦片數。W和H不超過20。
'.——一塊黑瓷磚
“#”——紅色瓷磚
@——一個男人在黑色的平鋪上(數據集中只出現一次)
?
思路:
找到起始位置然后進行 dfs,找到一個就標記一個,然后一直走下去
一開始自己想錯了,我以為是找最多的可以走的。但是后來感覺根據題目的意思來看就是找到一條路就可以了。哭泣
?
AC代碼:
1 #include <cstdio> 2 #include <string> 3 #include <iostream> 4 #include <algorithm> 5 #include <string.h> 6 #include <math.h> 7 #include <vector> 8 9 using namespace std; 10 11 const int maxn = 30; 12 13 char ss[maxn][maxn]; 14 int mx[] = {0,0,1,-1}; 15 int my[] = {1,-1,0,0}; 16 int vis[maxn][maxn]; 17 int n,m; 18 int cnt = 0; 19 20 bool check(int i,int j) 21 { 22 if (ss[i][j] == '.' && !vis[i][j]) 23 return true; 24 return false; 25 } 26 27 void dfs(int row,int col) 28 { 29 for (int i=0;i<4;i++) 30 { 31 int nx = row + mx[i]; 32 int ny = col + my[i]; 33 if (check(nx,ny)) 34 { 35 cnt++; 36 vis[nx][ny] = 1; 37 dfs(nx,ny); 38 } 39 } 40 41 } 42 43 44 int main() { 45 while (cin >> m >> n) { 46 if (m == 0 && n == 0) 47 return 0; 48 bool flag = false; 49 cnt = 0; 50 memset(vis,0, sizeof(vis)); 51 memset(ss,'#', sizeof(ss)); 52 for (int i = 1; i <= n; i++) { 53 for (int j = 1; j <= m; j++) { 54 cin >> ss[i][j]; 55 } 56 } 57 for (int i = 1; i <= n; i++) { 58 for (int j = 1; j <= m; j++) { 59 if (ss[i][j] == '@') { 60 dfs(i, j); 61 printf("%d\n", cnt + 1); 62 flag = true; 63 break; 64 } 65 } 66 if (flag) 67 break; 68 } 69 } 70 }?
轉載于:https://www.cnblogs.com/-Ackerman/p/11175129.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Red and Black (找到一个标记一个)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlite3 学习
- 下一篇: 双数据源配置(一个项目中链接两个数据库)