Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

WA好多次了,郁闷啊。试了变量赋初值,数组开大一点,希望大家帮忙,附丑陋代码。

Posted by ocelot1985 at 2011-08-15 21:51:36 on Problem 1164
#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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator