Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
WA好多次了,郁闷啊。试了变量赋初值,数组开大一点,希望大家帮忙,附丑陋代码。#include <stdio.h> #include <stdlib.h> #include <string.h> /* ---- stack data-structure ---- */ struct pos { int row; int col; struct pos *next; }; struct pos *head, *tail; /* ---- operatioin of stack ---- */ void init(void) { head = tail = NULL; } void push(int row, int col) { struct pos *tmp = NULL; if (head == NULL && tail == NULL) { tmp = (struct pos*)malloc(sizeof(struct pos)); if (tmp == NULL) exit(-1); tmp->row = row; tmp->col = col; head = tail = tmp; } else { tmp = (struct pos*)malloc(sizeof(struct pos)); if (tmp == NULL) exit(-1); tmp->row = row; tmp->col = col; tmp->next = head; head = tmp; } } int pop(int *row, int *col) { struct pos *tmp = NULL; if (head == tail) { if (head == NULL) return 1; *row = head->row; *col = head->col; free(head); head = tail = NULL; } else { *row = head->row; *col = head->col; tmp = head; head = tmp->next; free(tmp); } return 0; } /* ---- main algorithm for dealing the problem ---- */ void castle(int (*room)[70], int row, int col) { int flag[50][50] = {}; // array of flags for deciding which cell is accessed, which one is not int i, j, cur_row, cur_col, cell; int cnt, cnt_cell, ret, max; // this two variable is just for debugging ---- int m, n; init(); // initialize the stack data-structure cnt = 0; // number of rooms cnt_cell = 0; // count of cells of one room max = 0; // the number of cells which the largest room has cur_row = cur_col = 0; cell = 0; ret = 0; for (i = 0;i < row;i++) for (j = 0;j < col;j++) { if (flag[i][j] == 0) { push(i,j); cnt_cell++; flag[i][j] = 1; cur_row = i; cur_col = j; while (1) { cell = room[cur_row][cur_col]; if (!(cell&1)) { push(cur_row,cur_col-1); if (flag[cur_row][cur_col-1] == 0) cnt_cell++; flag[cur_row][cur_col-1] = 1; room[cur_row][cur_col] |= 1; cur_col = cur_col - 1; room[cur_row][cur_col] |= 4; } else if (!(cell&2)) { push(cur_row-1,cur_col); if (flag[cur_row-1][cur_col] == 0) cnt_cell++; flag[cur_row-1][cur_col] = 1; room[cur_row][cur_col] |= 2; cur_row = cur_row - 1; room[cur_row][cur_col] |= 8; } else if (!(cell&4)) { push(cur_row,cur_col+1); if (flag[cur_row][cur_col+1] == 0) cnt_cell++; flag[cur_row][cur_col+1] = 1; room[cur_row][cur_col] |= 4; cur_col = cur_col + 1; room[cur_row][cur_col] |= 1; } else if (!(cell&8)) { push(cur_row+1,cur_col); if (flag[cur_row+1][cur_col] == 0) cnt_cell++; flag[cur_row+1][cur_col] = 1; room[cur_row][cur_col] |= 8; cur_row = cur_row + 1; room[cur_row][cur_col] |= 2; } else { ret = pop(&cur_row,&cur_col); if (ret != 0) break; } } //end of while if (cnt_cell > max) max = cnt_cell; cnt_cell = 0; cnt++; /* this is for debugging, to print the status of every cell for (m = 0;m < row;m++) { for (n = 0;n < col;n++) printf("%d ",flag[m][n]); printf("\n"); } printf("\n"); */ } // end of if } // end of second for printf("%d\n",cnt); printf("%d\n",max); return; } int main(void) { int row, col, i, j, val; int room[70][70] = {}; scanf("%d",&row); scanf("%d",&col); if (row < 0 || row > 50 || col < 0 || col > 50) exit(-1); for (i = 0;i < row;i++) { for (j = 0;j < col;j++) { scanf("%d",&val); if (val < 0 || val > 15) exit(-1); room[i][j] = val; } } castle(room,row,col); /* just for print the array for (i = 0;i < row;i++) { for (j = 0;j < col; j++) printf("%d ",room[i][j]); printf("\n"); } */ return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator