P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

模拟题嘛,就跟着模拟就好了。。。


首先我们要了解数组存储的下标和直角坐标系的关系;

#include 
using namespace std;

int ac[2][4];

int main()
{
	for(int i = 0;i < 2; i++){
		for(int j = 0;j < 4; j++)
			cout << ac[i][j] << " ";
		cout << endl;
	}
	return 0;
}

P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two_第1张图片

 可以看到 i 是往下的,j是往右的,那么数组存储方式就是直角坐标系的第四象限,i为y,j为x。


AC代码如下

#include 
using namespace std;

int f1,f2,c1,c2,f3,c3;//f3,c3 为朝向的方向;0-3,若当前不移动则转向
char ac[13][13];

void move(int f3);
void move1(int c3);

int main()
{
	for(int i = 1;i <= 10; i++)
		for(int j = 1;j <= 10; j++){
			cin >> ac[i][j];
			if(ac[i][j] == 'C')
				c1 = i,c2 = j;
			if(ac[i][j] == 'F'){
				f1 = i,f2 = j;
			}
		}
	
	//0-右  1-下  2-左  3-上
	
	int t = 0;
	f3 = 3,c3 = 3;
	while(1){
		if(f1 == c1 && f2 == c2){
			cout << t;
			break;
		}
		
        //当追的次数大于一定值时则认为追不上(再追就不礼貌了)
		if(t > 999999){
			cout << 0;
			break;
		}
			
		
		//移动 方向只有4个
		move(f3 % 4);
		move1(c3 % 4);
		t++;
	}
	
	return 0;
} 

void move(int k){
	if(k == 0){
		if(ac[f1][f2 + 1] == '*' || (f2 == 10 && k == 0))
			f3++;
		else f2++;
	}
	
	if(k == 1){
		if(ac[f1 + 1][f2] == '*' || (f1 == 10 && k == 1))
			f3++;
		else f1++;
	}
	
	if(k == 2){
		if(ac[f1][f2 - 1] == '*' || (f2 == 1 && k == 2))
			f3++;
		else f2--;
	}
	
	if(k == 3){
		if(ac[f1 - 1][f2] == '*' || (f1 == 1 && k == 3))
			f3++;
		else f1--;
	}
}

void move1(int k1){
	if(k1 == 0){
		if(ac[c1][c2 + 1] == '*' || (c2 == 10 && k1 == 0))
			c3++;
		else c2++;
	}
	
	if(k1 == 1){
		if(ac[c1 + 1][c2] == '*' || (c1 == 10 && k1 == 1))
			c3++;
		else c1++;
	}
	
	if(k1 == 2){
		if(ac[c1][c2 - 1] == '*' || (c2 == 1 && k1 == 2))
			c3++;
		else c2--;
	}
	
	if(k1 == 3){
		if(ac[c1 - 1][c2] == '*' || (c1 == 1 && k1 == 3))
			c3++;
		else c1--;
	}
}

你可能感兴趣的:(题解,c++,算法,开发语言)