好久没写搜索,到忘了,找了半个小时错误。
一开始又把题看错了,真服自己了。(认真审题)
这题可以用excel写。but作为一个程序园,那就要使用灵魂操作。
核心算法:bfs层次遍历
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 string s[35]; 5 int vist[35][55];//标记 6 int disx[4] = {0, 0, -1, 1}; 7 int disy[4] = {1, -1, 0, 0}; 8 int minn = 2000; 9 int cnt = 0; 10 int main(){ 11 memset(vist, -1, sizeof(vist)); 12 for(int i = 0; i < 30; ++ i) 13 cin >> s[i]; 14 queue<pair<int, pair<int, int>>> q; 15 for(int i = 0; i < 50; ++ i) 16 if(s[0][i] != '1') 17 q.push(make_pair(0, make_pair(0, i))), vist[0][i] = 0; 18 19 while(q.size()){ 20 21 auto now = q.front();q.pop(); 22 if(now.first >= minn) break; 23 for(int i = 0; i < 4; ++ i){ 24 int ntx = now.second.first + disx[i]; 25 int nty = now.second.second + disy[i]; 26 27 if(ntx < 0 || ntx >= 30 || nty < 0 || nty >= 50)continue; 28 if(s[ntx][nty] == '1')continue; 29 if(vist[ntx][nty] != -1 && vist[ntx][nty] < now.first + 1)continue; 30 if(ntx == 29) 31 { 32 minn = now.first + 1; cnt ++; 33 cout << minn << endl; 34 } 35 q.push(make_pair(now.first + 1, make_pair(ntx, nty))); 36 37 vist[ntx][nty] = now.first + 1;/*1110111 38 1100011 39 1101011 40 1100011 41 1110111*/ //解决这种情况,防止少数 42 } 43 } 44 cout << cnt << endl; 45 return 0; 46 } 47 48 49