城堡问题

来源:互联网 发布:windows pdf阅读器下载 编辑:程序博客网 时间:2024/04/28 07:54
// 上学期怎么这么傻逼啊(吐槽)#include <iostream>using namespace std;// 建立一个room类,存墙壁和是否走过的信息,类或结构体都好class room{public:room(){e = n = s = w = 0;walked = 0;}int e, n, s, w, walked;}room[60][60];int m, n;int Try(int i, int j){if(room[i][j].walked || i >= m || i < 0 || j >= n || j < 0)return 0;room[i][j].walked = 1;int sum = 1;if(room[i][j].e == 0)sum += Try(i, j + 1);if(room[i][j].w == 0)sum += Try(i, j - 1);if(room[i][j].n == 0)sum += Try(i - 1, j);if(room[i][j].s == 0)sum += Try(i + 1, j);return sum;}int main(){cin >> m >> n;int max = 0;int totalRoom = 0;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++)       // 发现给的墙壁的信息很奇妙,如果是奇数,那么肯定有权为1的(西)墙{                                    int info;cin >> info;room[i][j].w = info % 2;info /= 2;                  // 如果除了2(整数除法)还是个奇数,那么肯定有权为2的(北)墙room[i][j].n = info % 2;info /= 2;room[i][j].e = info % 2;    info /= 2;                  // 等等……room[i][j].s = info % 2;    // 之所以这么做可行,是因为西墙是奇数(1),北墙是2,被除以2是奇数,}                                   // 东墙是4,被除以2再除以2是奇数……等等}for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(room[i][j].walked == 0){totalRoom++;int t = Try(i, j);max = max > t ? max : t;}}}cout << totalRoom << endl << max << endl;return 0;}

原创粉丝点击