void bfs_iterative(LGraph graph, Vertex start, void (*func)(nodeptr p)) { int visited[graph->vertex_num]; Queue queue = CreateQueue(graph->vertex_num); nodeptr curr; curr = graph->G[start]; visited[curr->adjv] = 1; enqueue(queue, curr); while (!QIsEmpty(queue)) { while (curr) { if (visited[curr->adjv] != 1) { enqueue(queue, curr); visited[curr->adjv] = 1; } else curr = curr->next; } nodeptr temp = dequeue(queue); curr = graph->G[temp->adjv]; (*func)(curr); } }
char DeQueue(char *q,int n,int &f) { char x; if(QIsEmpty(q,f)) return NULL; x = q[f]; q[f] = NULL; f++; if(f == n) f = 0; return x; }
void bfs_iterative(MGraph graph, Vertex start, void (*func)(int p)) { int visited[graph->vertex_num]; Queue queue = CreateQueue(graph->vertex_num); int curr; curr = start; // visited[curr] = 1; enqueue(queue, curr); while (!QIsEmpty(queue)) { for (int i = 0; i < graph->vertex_num; i++) if ((graph->G[curr][i] == 1) && (visited[i] != 1)) { enqueue(queue, i); visited[i]; } curr = dequeue(queue); (*func)(curr); } }
int main(void) { int i,j; int N,M; int x_cur = 0, y_cur = 0; int result = 0 ; int length = 1; Queue q; Data dequeData; QueueInit(&q); //입력을 받는다 scanf("%d %d",&N,&M); for(j=0; j<N; j++) { for(i=0; i<M; i++) { scanf("%d",&data[i][j].value); data[i][j].use = 0; } } //printf("test value %d\n",data[1][1].value); data[0][0].x_cur = 0; data[0][0].y_cur = 0; data[0][0].length = length; Enqueue(&q,&data[0][0]); while(!QIsEmpty(&q)) { //printf("deque\n"); //printf("data[0][0] : %d %d\n",data[0][0].x_cur,data[0][0].y_cur); dequeData = Dequeue(&q); data[dequeData.x_cur][dequeData.y_cur].use = 1; //printf("x_cur : %d y_cur : %d\n", dequeData.x_cur, dequeData.y_cur); //printf("dequeData.value %d\n",dequeData.value); if((data[dequeData.x_cur][dequeData.y_cur].value == 1 )) { if((dequeData.x_cur+1 < M)&& (data[dequeData.x_cur+1][dequeData.y_cur].use == 0)) { //printf("x_cur +1 enqueue\n"); data[dequeData.x_cur+1][dequeData.y_cur].length = dequeData.length + 1 ; data[dequeData.x_cur+1][dequeData.y_cur].x_cur = dequeData.x_cur + 1; data[dequeData.x_cur+1][dequeData.y_cur].y_cur = dequeData.y_cur; Enqueue(&q,&data[dequeData.x_cur+1][dequeData.y_cur]); } if((dequeData.y_cur+1 < N)&& (data[dequeData.x_cur][dequeData.y_cur+1].use == 0)) { //printf("y_cur +1 enqueue\n"); data[dequeData.x_cur][dequeData.y_cur+1].length = dequeData.length + 1 ; data[dequeData.x_cur][dequeData.y_cur+1].x_cur = dequeData.x_cur; data[dequeData.x_cur][dequeData.y_cur+1].y_cur = dequeData.y_cur + 1; Enqueue(&q,&data[dequeData.x_cur][dequeData.y_cur+1]); } if((0 <= dequeData.x_cur-1)&& (data[dequeData.x_cur-1][dequeData.y_cur].use == 0)) { //printf("x_cur -1 enqueue\n"); data[dequeData.x_cur-1][dequeData.y_cur].length = dequeData.length + 1 ; data[dequeData.x_cur-1][dequeData.y_cur].x_cur = dequeData.x_cur - 1; data[dequeData.x_cur-1][dequeData.y_cur].y_cur = dequeData.y_cur; Enqueue(&q,&data[dequeData.x_cur-1][dequeData.y_cur]); } if((0 <= dequeData.y_cur-1) && (data[dequeData.x_cur][dequeData.y_cur-1].use == 0)) { //printf("y_cur -1 enqueue\n"); data[dequeData.x_cur][dequeData.y_cur-1].length = dequeData.length + 1 ; data[dequeData.x_cur][dequeData.y_cur-1].x_cur = dequeData.x_cur; data[dequeData.x_cur][dequeData.y_cur-1].y_cur = dequeData.y_cur-1; Enqueue(&q,&data[dequeData.x_cur][dequeData.y_cur-1]); } } } printf("%d\n",data[M-1][N-1].length); return 0; }