1396. 【2014年鄞州区】挖掘机(d.pas/c/cpp)

题目描述
挖掘机学校哪家强?中国山东找蓝翔。这几天,蓝翔技工学校在进行挖掘机比赛。比赛是这样进行的:一块场地被划分成了nn个格子,每个学生要驾驶挖掘机不重复地开过每个格子,并且只允许在格子中间转弯。如下图,分别是44和3*3的情况
每个学生只能从边界上的点进出比赛场地。并且,为了显示高超的挖掘机驾驶技巧,比赛的分数就是在场地上转弯的次数,就是图中的1/4圆形标注的。比如1号图是12次,2号图是5次。
在这里插入图片描述

输入
一行:n (场地被划分成了n * n个格子 ,)
第2~n+1行:挖掘机的路线 (路线为从1 –>2->3…->n*n);

输出
一个整数,表示比赛的分数

样例输入

3

1 2 3

8 7 4

9 6 5

样例输出

5

数据范围限制

N<500

这道题是个真真真(在此省略n个)的水题
所以事不宜迟,直接上代码:

#include<bits/stdc++.h>
using namespace std;
int n,ans,a[3005][3005],x,y,way[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dg(int xx,int yy,int f,int num){
	if(num>n*n){
		return ;
	}
	for(int i=0;i<4;i++){
		int xxx=xx+way[i][0];
		int yyy=yy+way[i][1];
		if(a[xxx][yyy]==num+1&&xxx>=1&&xxx<=n&&yyy>=1&&yyy<=n){
			if(f!=i+1&&f!=0) ans++;
			dg(xxx,yyy,i+1,num+1);
		}
	}
}
int main(){
	freopen("d.in","r",stdin);
	freopen("d.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
			if(a[i][j]==1){
				x=i;
				y=j;
			}
		}
	}
	dg(x,y,0,1);
	printf("%d",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13159916.html