BFS入門経典(天神小学校)に加えて行列の基礎説明
6901 ワード
天神小学校時間制限(普通/Java):1000 MS/3000 MS運行メモリ制限:65536 KByte総提出:145試験合格:50
题目描述《corpse party:blood drive》中的一首歌《corpse party:blood drive》里的一首歌《corpse party:blood drive》里的一首歌《corpse party:blood drive》里的一首歌《corpse party:blood drive》.今は幸子がいないと仮定して、班長は自分の力で天神小学校を脱出しなければならない.天神小学校を二次元の迷路と見なすことができ、毎秒現在の位置から上下左右4つの隣接する格子の中までしか歩けない.天が小さくて崩れ続けているので、歩けない点が多い.班長に天小で完全に崩壊することができるかどうかを聞いて、つまりt秒以内に天神小学校を脱出することができます.
最初の行に1つの整数Tを入力し、データ群数を表すデータの最初の行に3つの整数n,m,tを入力すると、迷路の行数、列数、および天小崩壊までの残りの時間を表す.(3≦n,m≦20,t≦100)次にn行を入力し、各行に長さmの文字列が1つある.文字'.'通行可能文字を表す'*'は通行不能文字を表す'O'は出口文字を表す'X'は班長の開始位置を表す
出力出力出力「happy end」を脱出できれば「bad end」を出力
サンプル入力2 5 5 13.....*.*X*O ... …*.
5 5 14 ….. .*. .*X*O ... …*.
サンプル出力bad end happy end
実はまだC++に接触していない学生に対して、このコードは少し理解しにくいように見えますが、言語は言語で、思考の含有量がなくて、文法の規則を覚えていればいいです.キューを使用するには、まずヘッダファイルを含める必要があります.すると、include.int変数のように、キュー、queue qを宣言します.カスタムポイントのキューを宣言しました.q.pop()は、q.pop(t)のように、キューの最初の要素tを「蹴り」に出すq.push()は、q.push(t)のように、キューの最後に要素tを「どうぞ」に与える.q.front()は、t=q.front(t)のように、キューの最初の要素をtに与えることである.q.empty()キューが空の場合はtrueを返し、そうでない場合はfalse q.size()がキュー内の要素の個数を返すので、q.size==0でもオブジェクトが空であるか否かを判断する方法です.一般的な基础の深さは最小の连通のブロック(种の诘め込みのアルゴリズムをも叫んで、ウィキペディアの种の诘め込みの言叶はGIFアニメーションがあって、みんなは见てみることができます)を探して、広く最短の経路を求めます.
题目描述《corpse party:blood drive》中的一首歌《corpse party:blood drive》里的一首歌《corpse party:blood drive》里的一首歌《corpse party:blood drive》里的一首歌《corpse party:blood drive》.今は幸子がいないと仮定して、班長は自分の力で天神小学校を脱出しなければならない.天神小学校を二次元の迷路と見なすことができ、毎秒現在の位置から上下左右4つの隣接する格子の中までしか歩けない.天が小さくて崩れ続けているので、歩けない点が多い.班長に天小で完全に崩壊することができるかどうかを聞いて、つまりt秒以内に天神小学校を脱出することができます.
最初の行に1つの整数Tを入力し、データ群数を表すデータの最初の行に3つの整数n,m,tを入力すると、迷路の行数、列数、および天小崩壊までの残りの時間を表す.(3≦n,m≦20,t≦100)次にn行を入力し、各行に長さmの文字列が1つある.文字'.'通行可能文字を表す'*'は通行不能文字を表す'O'は出口文字を表す'X'は班長の開始位置を表す
出力出力出力「happy end」を脱出できれば「bad end」を出力
サンプル入力2 5 5 13.....*.*X*O ... …*.
5 5 14 ….. .*. .*X*O ... …*.
サンプル出力bad end happy end
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
const int lim=50;
using namespace std;
int dirx[4]= {-1, 1, 0, 0};
int diry[4]= {0, 0, -1, 1};
int row, col, time;
char Map[lim][lim];
int vis[lim][lim];
char str[300];
int xru, yru, xchu, ychu;
struct point
{
int x;
int y;
int step;
};
void bfs();
int main ()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int i, j, T;
cin>>T;
while(T--)
{
cin>>row>>col>>time;
memset(str, 0, sizeof(str));
memset(Map, 0, sizeof(Map));
memset(vis, 0, sizeof(vis));
for(i=1; i<=row; i++)
{
scanf("%s", str);
for(j=1; j<=col; j++)
Map[i][j]=str[j-1];
}
for(i=1; i<=row; i++)
for(j=1; j<=col; j++)
{
if(Map[i][j]=='X')
{
xru=j;
yru=i;
}
}
for(i=1; i<=row; i++)
for(j=1; j<=col; j++)
{
if(Map[i][j]=='O')
{
xchu=j;
ychu=i;
}
}
bfs();
}
return 0;
}
void bfs()
{
int i, j;
vis[xru][yru]=1;
point node, t;
queue<point> q;
node.x=xru;
node.y=yru;
node.step=0;
q.push(node);
while(!q.empty())
{
node=q.front();
q.pop();
for(i=0; i<4; i++)
{
t=node;
t.x+=dirx[i];
t.y+=diry[i];
t.step++;
if(t.x==xchu&&t.y==ychu)
{
printf("%s", t.step<=time?"happy end
":"bad end
");
return;
}
if(t.x<1||t.x>col||t.y<1||t.y>row||Map[t.y][t.x]=='*'||vis[t.y][t.x])
continue;
else
{
vis[t.y][t.x]=1;
q.push(t);
}
}
}
printf("bad end
");
return;
}
, bfs 。 。( , , , )
実はまだC++に接触していない学生に対して、このコードは少し理解しにくいように見えますが、言語は言語で、思考の含有量がなくて、文法の規則を覚えていればいいです.キューを使用するには、まずヘッダファイルを含める必要があります.すると、include.int変数のように、キュー、queue qを宣言します.カスタムポイントのキューを宣言しました.q.pop()は、q.pop(t)のように、キューの最初の要素tを「蹴り」に出すq.push()は、q.push(t)のように、キューの最後に要素tを「どうぞ」に与える.q.front()は、t=q.front(t)のように、キューの最初の要素をtに与えることである.q.empty()キューが空の場合はtrueを返し、そうでない場合はfalse q.size()がキュー内の要素の個数を返すので、q.size==0でもオブジェクトが空であるか否かを判断する方法です.一般的な基础の深さは最小の连通のブロック(种の诘め込みのアルゴリズムをも叫んで、ウィキペディアの种の诘め込みの言叶はGIFアニメーションがあって、みんなは见てみることができます)を探して、広く最短の経路を求めます.