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

这题用回溯做不行么?我怎么总是runtime error 啊?哪位大侠帮着看看!

Posted by lovezqian at 2007-03-13 21:27:06 on Problem 1324
#include <iostream>
#include <string.h>
using namespace std;

struct hol{
	int r, c;
};

struct hol h[9];
bool lair[21][21];
int n, m, L, K, head, tail;
int ans;
const int maxint = 99999999;

void modify(int newheadr, int newheadc, int tailr, int tailc)
{
	lair[newheadr][newheadc] = 1;
	lair[tailr][tailc] = 0;
	h[tail].r = newheadr;
	h[tail].c = newheadc;
	tail--;
	if (tail < 1)
		tail = L;
	head--;
	if (head < 1)
		head = L;
}

void retray(int newheadr, int newheadc, int tailr, int tailc)
{
	lair[newheadr][newheadc] = 0;
	lair[tailr][tailc] = 1;
	tail++;
	if (tail > L)
		tail = 1;
	head++;
	if (head > L)
		head = 1;
}

void backtrack(int cur_len)
{
	int headr = h[head].r, headc = h[head].c;
	int tailr = h[tail].r, tailc = h[tail].c;
	int tempr, tempc;
	
	if (headr == 1 && headc == 2 && lair[1][1] == 0 || headr == 2 && headc == 1 && lair[1][1] == 0)
	{
		cur_len++;
		if (cur_len < ans)
			ans = cur_len;
		return;
	}
	
	if (headr - 1 >= 1 && lair[headr-1][headc] != 1 && cur_len + headr-1 + headc-1 < ans)
	{
		tempr = h[tail].r;
		tempc = h[tail].c;
		cur_len++;
		modify(headr-1, headc, tailr, tailc);
		
		backtrack(cur_len);
		
		cur_len--;
		retray(headr-1, headc, tailr, tailc);
		h[tail].r = tempr;
		h[tail].c = tempc;
	}
	
	if (headc - 1 >= 1 && lair[headr][headc-1] != 1 && cur_len + headr-1 + headc-1 < ans)
	{
		tempr = h[tail].r;
		tempc = h[tail].c;
		cur_len++;
		modify(headr, headc-1, tailr, tailc);
		
		backtrack(cur_len);
		
		cur_len--;
		retray(headr, headc-1, tailr, tailc);
		h[tail].r = tempr;
		h[tail].c = tempc;
	}
	
	if (headc + 1 <= m && lair[headr][headc+1] != 1 && cur_len + headr + headc < ans)
	{
		tempr = h[tail].r;
		tempc = h[tail].c;
		cur_len++;
		modify(headr, headc+1, tailr, tailc);
		
		backtrack(cur_len);
		
		cur_len--;
		retray(headr, headc+1, tailr, tailc);
		h[tail].r = tempr;
		h[tail].c = tempc;
	}
	
	if (headr + 1 <= n && lair[headr+1][headc] != 1 && cur_len + headr + headc < ans)
	{
		tempr = h[tail].r;
		tempc = h[tail].c;
		cur_len++;
		modify(headr+1, headc, tailr, tailc);
		
		backtrack(cur_len);
		
		cur_len--;
		retray(headr+1, headc, tailr, tailc);
		h[tail].r = tempr;
		h[tail].c = tempc;
	}
}

int main()
{
	int r, c, T = 0;
	
	while (scanf("%d%d%d", &n, &m, &L) && (n || m || L))
	{
		T++;
		memset(lair, 0, sizeof(0));
		for (int i = 1; i <= L; i++)
		{
			scanf("%d%d", &r, &c);
			h[i].r = r;
			h[i].c = c;
			lair[r][c] = 1;
		}
		scanf("%d", &K);
		for (int i = 1; i <= K; i++)
		{
			scanf("%d%d", &r, &c);
			lair[r][c] = 1;
		}
		
		if (n == 1 && m == 1)
		{
			printf("Case %d: 0\n", T);
			continue;
		}
		
		ans = maxint;
		head = 1; tail = L;
		backtrack(0);
		if (ans == maxint)
			printf("Case %d: -1\n", T);
		else
			printf("Case %d: %d\n", T, ans);
	}
	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