タイトル:天気予報
URL:http://poj.org/problem?id=2044
あなたがコントロールすることができますが、雨の神です。
あなたは、十分な雨を持つことができ平時の土地に期待して、慈悲深い神です市場に行くと休日は太陽の光に満ちすることができます。
あなたは村の気象条件の制御を担当しています。
下に示すように4×4の格子状の分布として村は、各領域内の村は番号付けされています。
あなたは2クラウド2 xの大きさを持って、この作品は、村外クラウドにではありません。
あなたは村と祝日スケジュールのエリアごとに時間の公正な期間を受け取ることになります。
初日この時には、中央の領域(6-7-10-11)は雨が降ります。
それぞれの連続した日に、あなたは、クラウドまたは2つの正方形を移動させる、一つの方向に4つの基本方向(トラック)の中から選択することができ、又は同じ位置に留まります。
これは、斜めの動きを許可していません。
任意の領域は、7つ以上の連続した日、または全く降雨時間にすることはできません。
あなたが任意の配慮を必要としないこの時間以外の雨の日の状況。
入力形式
テストケースの複数のセットを入力します。
各試験のために、最初の行は、整数Nを含有し、この時間の間の日数を表します。
公正かつ祭りスケジュールの次のN日を描いた、i行目はi日のスケジュールを表し、Nラインを引き継ぎました。
これは、N行で、16桁(0又は1)を含む各行は、0は正常な日であり、1が公正日の休日を表し、i番目の桁は、i番目の領域の特定の場合を示します。
数字の各列の間のスペースで区切られました。
入力テストケースN = 0の場合、入力が終了し、治療せずに使用する場合です。
出力フォーマット
0又は1の整数、雨雨が少ない間違った場所に比べて、1が出力される全時間、ことを保証することができ、各テストケース出力。
それは出力0、および各結果の行を保証することができない場合。
データ範囲
1≤N≤365
サンプル入力:
1
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1
0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
7
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0
0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
0
出力例:
0
1
0
1
この質問は、実際に多くの詳細です。
、実際には、四隅で判断することができる最初、連続7日間、各領域がない散水かどうかを決定しません。
あなたは、クラウドの現在のステータスの座標を定義した場合、そして、質問の意味不一致の状態で四隅、表現するのは難しいです。
状態が日の異なる数が異なる場合には、同じ状態のため、次に、四隅の座標場合であり、かつ場合;
要約すると、定義:状態(時間、(x、y)は、(D1、D2、D3、D4))。
したがって、そのような条件は、この条件は正確ケースの状態を記述することができることを確実にするために、すなわち、満たさ一意です。
連続7日間は、とても安全であることを、我々は状態を圧縮オクタル(D1、D2、D3、D4 )、 すなわち、D1 + D2 * 8 + D3 * 64 + D4 * 512;
残り、細部に注意を払うと、
コードは次のよう:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
struct state
{
int turn, pos, code;
state (int x, int y, int z) : turn(x), pos(y), code(z) {}
};
const int dx[10] = {-1, 1, 0, 0, -2, 2, 0, 0}, dy[10] = {0, 0, -1, 1, 0, 0, -2, 2};
bool day[366][17], vis[366][17][4096];
int n;
bool valid(state p)
{
if(vis[p.turn][p.pos][p.code]) return false;
for(int i = 0; i < 4; ++ i)
{
if(p.code % 8 >= 7) return false;
p.code >>= 3;
}
if(day[p.turn][p.pos] || day[p.turn][p.pos + 1] || day[p.turn][p.pos + 4] || day[p.turn][p.pos + 5]) return false;
return true;
}
bool valid(int x, int y)
{
if(x < 0 || x > 2 || y < 0 || y > 2) return false;
//be aware of it : The range is [0, 2] !!
return true;
}
bool bfs()
{
queue <state> Q;
int x, y;
int p[4] = {}, tmp = 0;
while(!Q.empty()) Q.pop();
memset(vis, false, sizeof(vis));
if(!valid(state(1, 6, 1 + 8 + 64 + 512))) return false;
vis[1][6][1 + 8 + 64 + 512] = true;
Q.push(state(1, 6, 1 + 8 + 64 + 512));
// The coodinate must be transfered into this form (x,y) to avoid mistakes about position!!
while(!Q.empty())
{
state now = Q.front(); Q.pop();
tmp = now.code;
for(int i = 0; i < 4; ++ i)
{
p[i] = tmp % 8;
tmp >>= 3;
}
x = (now.pos - 1) / 4, y = (now.pos - 1) % 4;
for(int i = 0; i < 9; ++ i)
{
state next = state(now.turn + 1, (x + dx[i]) * 4 + y + 1 + dy[i], 0);
if(!valid(x + dx[i], y + dy[i])) continue;
switch(next.pos)
{
case 1:
{
next.code = (p[1] + 1) * 8 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
break;
}
case 3:
{
next.code = p[0] + 1 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
break;
}
case 9:
{
next.code = p[0] + 1 + (p[1] + 1) * 8 + (1 + p[3]) * 512;
break;
}
case 11:
{
next.code = p[0] + 1 + (p[1] + 1) * 8 + (1 + p[2]) * 64;
break;
}
default:
{
next.code = p[0] + 1 + (p[1] + 1) * 8 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
break;
}
}
if(!valid(next)) continue;
if(next.turn == n)return true;
vis[next.turn][next.pos][next.code] = true;
Q.push(next);
}
}
return false;
}
int main()
{
while(scanf("%d", &n) == 1)
{
if(!n) return 0;
memset(day, false, sizeof(day));
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= 16; ++ j) scanf("%d", &day[i][j]);
printf("%d\n", bfs());
}
return 0;
}/*
challenge : 1. the design of state
2. the extention of states
3. the pictures of position
*/