程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU4708 Rotation Lock Puzzle 不錯的模擬題

HDU4708 Rotation Lock Puzzle 不錯的模擬題

編輯:C++入門知識

HDU4708 Rotation Lock Puzzle 不錯的模擬題


題意:給你一個n*n的矩陣,n為奇數,以最中心的一個數為基准,可以把這個矩陣 看成一圈一圈的,每一圈都可以逆時針或者順時針旋轉,每一次旋轉每個元素只能移動一個單元格,求經過每一圈的旋轉矩陣兩個對角線和最大的值,並求出最少旋轉次數


一圈一圈的處理,注意最中心的那個數不用管,就它一個,那麼這個矩陣只有n/2圈需要操作,對於每一圈的元素都放在一個一維數組裡面,然後枚舉這個數組裡的每一個元素為開頭,統計接下來的三個數,求和比較大小即可,因為有逆時針的,所以順時針時從開頭開始枚舉,逆時針則從尾部開始枚舉,這題數據貌似有些爛,


int n;

int mp[15][15];


void init() {
	memset(mp,0,sizeof(mp));
}

bool input() {
	while(cin>>n,n) {
		for(int i=0;i>mp[i][j];
		return false;
	}
	return true;
}

void cal() {
	int ans = 0;
	int cnt = 0;
	int nnum = n/2;
	int aa[100 + 55];
	for(int k=0;kk;j--)aa[pos++] = mp[n - k - 1][j];
		for(int i=n - k - 1;i>k;i--)aa[pos++] = mp[i][k];
		for(int i=0;i<=(pos + 1)/2;i++) {
			int tmp = 0;
			tmp = aa[i%pos] + aa[(i+(n-2*k-1))%pos] + aa[(i+2*(n-2*k-1))%pos] + aa[(i+3*(n-2*k-1))%pos];
			if(tmp > sum) {
				sum = tmp;
				now = i;
			}
			if(tmp == sum) {
				if(i < now)
					now = i;
			}
		}
		for(int i=pos-1,mark = 0;mark <=(pos+1)/2;i--) {
			int tmp = 0;
			tmp = aa[i%pos] + aa[(i+(n-2*k-1))%pos] + aa[(i+2*(n-2*k-1))%pos] + aa[(i+3*(n-2*k-1))%pos];
			if(tmp > sum) {
				sum = tmp;
				now = pos - i;
			}
			if(tmp == sum) {
				if(pos - i < now)
					now = pos - i;
			}
			mark++;
		}
		ans += sum;
		cnt += now;
	}
	ans += mp[n/2][n/2];
	cout<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved