对符合条件的状态的判断比较困难 C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 366;
int n;
//天,坐标,四个角没有下雨的天数
//bfs防止向回搜索可以通过bool或者在寻找最短路径的时候通过更改数组的值来实现
bool st[N][3][3][7][7][7][7];
struct Node
{
int day, x, y, s0, s1, s2, s3;
};
//每天个过节情况
int state[N][4][4];
int bfs()
{
//如果第一天就不可以下雨,直接返回
if(state[1][1][1] || state[1][1][2] || state[1][2][1] || state[1][2][2]) return 0;
queue<Node> q;
memset(st, 0, sizeof st);
//第一天云在中心所有四个角的区域都没有下雨
q.push({1,1,1,1,1,1,1});
st[1][1][1][1][1][1][1] = true;
int dx[] = {-1, 0, 1, 0, 0};
int dy[] = {0, 1, 0, -1, 0};
while(q.size())
{
auto t = q.front();
q.pop();
if(t.day == n)
return 1;
//每一个方向可以走一步或者两步
for(int i = 0 ; i < 5; i++)
for(int j = 1; j <= 2; j++)
{
int x = t.x + dx[i] * j;
int y = t.y + dy[i] * j;
if(x < 0 || x >= 3 || y < 0 || y >= 3) continue;
auto &s = state[t.day + 1];
if(s[x][y] || s[x][y + 1] || s[x + 1][y + 1] || s[x + 1][y]) continue;
int s0 = t.s0, s1 = t.s1, s2 = t.s2, s3 = t.s3;
if(!x && !y) s0 = 0;
else if( ++ s0 == 7) continue;
if(!x && y == 2) s1 = 0;
else if( ++ s1 == 7) continue;
if(x == 2 && !y) s2 = 0;
else if( ++ s2 == 7) continue;
if(x == 2 && y == 2) s3 = 0;
else if( ++ s3 == 7) continue;
if(st[t.day + 1][x][y][s0][s1][s2][s3]) continue;
st[t.day + 1][x][y][s0][s1][s2][s3] = true;
q.push({t.day + 1, x, y, s0, s1, s2, s3});
}
}
return 0;
}
int main()
{
//对数据循环 读取-> 处理 -> 输出
while(cin >> n, n)
{
for(int i = 1; i <= n; i++)
for(int j = 0; j < 4; j++)
for(int k = 0; k < 4; k++)
cin >> state[i][j][k];
cout << bfs() << endl;
}
return 0 ;
}
%%%