合肥工业大学 OnlineJudge——1005 D-诅咒教派

Time Limit: 1000 MS Memory Limit: 65536 KB


Description


    两天后,在安道尔的郊外,阿尔萨斯和吉安娜建立的一个基地,并向克尔苏加德诅咒教派的教徒们发动了进攻。一番苦战之后,王子的军队终于击败并杀死了克尔苏加德,可是这片土地的腐化已经无可避免了。阿尔萨斯要组织当地的居民撤离,在此之前,他需要知道整片土地完全腐化需要多长的时间。

    安道尔郊外的土地一共有m*n块(m<=10,n<=10),由于每块土地的地形不同,所以它们完全腐化所需要的时间分别是t[m][n](t[m][n]<=10)。每块土地当且仅当与它相邻的某块土地完全腐化后才开始腐化。土地是从x,y(0<=x

 

Input

 

输入包括多组数据,每组数据的第一行是m,n,x,y四个正整数,接下来有m行,每行n个数,表示t[m][n]。

 

Output

 

对每组输入的数据,输出一个数表示这块土地腐化的时间

 

Sample Input

 

2 4 1 1
7 6 2 2
2 10 7 4

 

Sample Output

 

21

 

Source

 

Gardon & Gondar

 

解题思路:

一开始的思路是用数组存储,每次循环将0周围的数-1,然后时间+1,之后发现一种情况,当区域为:

 

1012时,0将两边-1之后遍历到右边的1,此时1-1变成了0再次将周围-1,而这个0应该是在这个时间点后再变化的

之后构思再创建一个数组,将更改保存在新数组中,每次循环结束再复制到原数组中

此时的代码(WA):

#include
#include
using namespace std;

//记录当前时间初始的腐化状态 
int t[11][11]= {};
//记录在这个时间更改后的腐化状态 
int th[11][11]= {};
int m,n,x,y;

//如果全部腐化了返回true 
bool finish() {
	for(int i=0; i=0 && th[i-1][j]!=0) {
		th[i-1][j]--;
	}

	if(i+1=0 && th[i][j-1]!=0) {
		th[i][j-1]--;
	}

	if(j+1>m>>n>>x>>y) {
		for(int i=0; i>t[i][j];
			}
		}
		int time = 0;
		//将第一个腐化的位置先腐化完毕 
		while(t[x][y] != 0) {
			time++;
			t[x][y]--;
		}
		//复制此时刻初始状态
		memcpy(th,t,sizeof(t));
		while(!finish()) {
			for(int i=0; i

这个时候样例过了,也没想到有什么特殊情况,交了WA,之后输出每时刻的状态发现了问题:如果区域为020,按照这样的方法会在一个时间后变成000,而实际上一个时间只会腐化一次

之后设置了一个visited数组用于判断每个位置是否腐化过了,如果腐化过了就不会再-1,成功AC

总结:测试时把每步状态输出一遍,与构思状态判断是否相同,可以更有效的找到是否存在问题

AC代码:

#include
#include
using namespace std;

//记录当前时间初始的腐化状态
int t[11][11]= {};
//记录在这个时间更改后的腐化状态
int th[11][11]= {};
//记录此时刻每个位置是否已经腐化过 
bool visited[11][11]={};
int m,n,x,y;

//如果全部腐化了返回true 
bool finish() {
	for(int i=0; i=0 && th[i-1][j]!=0 && !visited[i-1][j]) {
		th[i-1][j]--;
		visited[i-1][j] = true;
	}

	if(i+1=0 && th[i][j-1]!=0 && !visited[i][j-1]) {
		th[i][j-1]--;
		visited[i][j-1] = true;
	}

	if(j+1>m>>n>>x>>y) {
		for(int i=0; i>t[i][j];
			}
		}
		int time = 0;
		//将第一个腐化的位置先腐化完毕
		while(t[x][y] != 0) {
			time++;
			t[x][y]--;
		}
		//复制此时刻初始状态
		memcpy(th,t,sizeof(t));
		while(!finish()) {
			for(int i=0; i

 

你可能感兴趣的:(合肥工业大学,OnlineJudge,题目合集)