小かまどの2回目の作業

4872 ワード

最初のbfs:poj 3984
http://poj.org/problem?id=3984
1つの迷路、その中の1は壁を表して、0は歩くことができる道を表して、横に歩くか縦に歩くしかなくて、斜めに歩くことができなくて、プログラムを編んで左上の角から右下の角までの最短のルートを探し出すことを要求します.
1つ目の問題は経路をどのように記録するかであり、構造体で記録したくないので、配列を再開し、一歩ずつ前の部分を記録することを考えると、逆に見つけることができ、bfsはキューで実現されているので、1回目に書くときは自作聡明にqueue(stl)を使い、悲劇の発見では2次元座標を保存できないので、自分でキューを書き直し(1回目の書き込み、headとtailの付与値に様々なクラッシュがあり、tailの++位置、および初期値が0,1の問題に注意)、キューにも2次元配列が開き、2次元目には【2】が開き、xとyを表し、pre配列が開き、本来は2次元配列を直接開いて地図にすればいいのですが、しかし横長座標を1つに保存することはできないので、仕方なく3次元(同じ1回目)を開いてみましたが、同じx,yを表していて、出力するときは逆さまにして、1回目は再帰するという考えでprint関数を書いて、後で知られました.スタックを使ってもいいですが、どうせ書いたことがないので、試してみましたが、両方のコードがacになりました.
スタック出力:
#include <iostream>
#include <cstdio>


using namespace std;
bool a[5][5];
int book [5][5];
int next [4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int pre[5][5][2];
int queue[120][2];
int stack[100][2];


int main()
{
    for (int i = 0 ; i < 5 ; i++)
        for (int j = 0  ; j < 5 ; j++)
        {
            scanf("%d,",&a[i][j]);


        }


    int i = 0 , j = 0 ;
    int head = 0 ,flag = 0,tail = 1,xa,xb;
    queue[head][0] = i;
    queue[head][1] = j;
    book[0][0] = 1;
    int l = 0;


    while (head < tail)
    {
        for (int k = 0 ; k < 4 ; k++)
        {
            xa = i + next[k][0];
            xb = j + next[k][1];
            if(xa >= 0 && xa < 5 && xb >= 0 && xb < 5 && !a[xa][xb] && !book [xa][xb])
            {
                book[xa][xb] = 1;
                pre[xa][xb][0] = i;
                pre[xa][xb][1] = j;




                if(xa == 4 && xb == 4)
                  {
                      flag = 1;
                      break;
                  }
               queue[tail][0] = xa;
               queue[tail++][1] = xb;
            }
        }
        head++;
        if(flag)
            break;
        i = queue[head][0];
        j = queue[head][1];


    }
    i = 4 ; j = 4;
    int x = 4 , y = 4;
    stack[l][0] = i;
    stack[l++][1] = j;
     //print (i ,j);
     while (1)
     {
         if(x == 0 && y == 0)
            break;
         stack[l][0] = pre[i][j][0];
         stack[l++][1] = pre[i][j][1];
         x = pre[i][j][0];
         y = pre[i][j][1];
         i = x;
         j = y;
     }


     for (int p = l - 1 ; p >= 0;p--)
        printf("(%d, %d)
",stack[p][0],stack[p][1]);     return 0; }


-------------------------------------------------------------------------------


#include <iostream>
#include <cstdio>

using namespace std;
bool a[5][5];
int book [5][5];
int next [4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int pre[5][5][2];
int queue[120][2];

void print(int i , int j)
{
    if (i == 0 && j == 0)
        {
            printf("(0, 0)
"); return ; } print(pre[i][j][0],pre[i][j][1]); printf("(%d, %d)
",i ,j); return ; } int main() { for (int i = 0 ; i < 5 ; i++) for (int j = 0 ; j < 5 ; j++) { scanf("%d,",&a[i][j]); // queue[i * 5 + j][0] = i; // queue[i * 5 + j][1] = j; } int i = 0 , j = 0 ; int head = 0 ,flag = 0,tail = 1,xa,xb; queue[head][0] = i; queue[head][1] = j; book[0][0] = 1; while (head < tail) { for (int k = 0 ; k < 4 ; k++) { xa = i + next[k][0]; xb = j + next[k][1]; if(xa >= 0 && xa < 5 && xb >= 0 && xb < 5 && !a[xa][xb] && !book [xa][xb]) { book[xa][xb] = 1; pre[xa][xb][0] = i; pre[xa][xb][1] = j; if(xa == 4 && xb == 4) { flag = 1; break; } queue[tail][0] = xa; queue[tail++][1] = xb; } //tail++; } head++; if(flag) break; i = queue[head][0]; j = queue[head][1]; // printf("%d %d
",i,j); } i = 4 ; j = 4; print (i ,j); return 0; }