1. 程式人生 > >2013藍橋杯c語言C組第10題

2013藍橋杯c語言C組第10題

標題:剪格子
如圖p1.jpg所示,3 x 3 的格子中填寫了一些整數。

在這裡插入圖片描述
我們沿著圖中的紅色線剪開,得到兩個部分,每個部分的數字和都是60。

本題的要求就是請你程式設計判定:對給定的m x n 的格子中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。
如果存在多種解答,請輸出包含左上角格子的那個區域包含的格子的最小數目。   
如果無法分割,則輸出 0

程式輸入輸出格式要求:

程式先讀入兩個整數 m n 用空格分割 (m,n<10)
表示表格的寬度和高度
接下來是n行,每行m個正整數,用空格分開。每個整數不大於10000
程式輸出:在所有解中,包含左上角的分割區可能包含的最小的格子數目。

例如:
使用者輸入:
3 3
10 1 52
20 30 1
1 2 3

則程式輸出:
3

再例如:
使用者輸入:
4 3
1 1 1 1
1 30 80 2
1 1 1 100

則程式輸出:
10

(參見p2.jpg)

資源約定:
峰值記憶體消耗 < 64M
CPU消耗 < 5000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入…” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main函式需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

/*	
   2013預賽c語言c組最後一題
	不多說直接DFS深搜

*/


#include<iostream>
using namespace std;
#define N 12


struct Map{
	int value; //權重
	int flage; //標記
}map[N][N];  //定義一個結構體二維陣列來儲存地圖 


//定義一個全域性變數用來記錄結果的最小值 
int result=1000000;

//定義一個全域性變數來儲存輸入資料的和
int s=0; 

//初始化地圖 
void init(int row,int col){

	//多加兩層行和列是為了解決邊界判斷問題
	//設定多加的兩層行和列設定為不可訪問 

	for(int i=0;i<=col+1;i++){
		map[0][i].flage=1;
		map[row+1][i].flage=1;
	}
	for(int i=0;i<=row+1;i++){
		map[i][0].flage=1;
		map[i][col+1].flage=1;	
	}

	for(int i=0;i<row;i++){
		for(int j=0;j<col;j++){
			
			cin>>map[i+1][j+1].value;
			s+=map[i+1][j+1].value;
			map[i+1][j+1].flage=0;
			
		}
	}
	
	
}
 

void dfs(int sum,int x,int y,int k){
	
	
	//更新到達該點的權重和	
	sum=sum+map[x][y].value;


 
	//遞迴出口 
	if(sum>s/2)
		return ;
	if(sum==s/2){
		result=result<k?result:k;
		return ;		
	}
	
	
	
	//方向陣列 
	int dir[][2]={{1,0},{-1,0},{0,1},{0,-1}};
	
	
	//4個方向進行深度搜索 
	for(int i=0;i<4;i++){
		int x1=x+dir[i][0];
		int y1=y+dir[i][1];
		if(map[x1][y1].flage==0){
			map[x1][y1].flage=1;
			dfs(sum,x1,y1,k+1);
			map[x1][y1].flage=0;
		}	
	}
	
}


int main(){
	



	
	int row,col;
	cin>>col>>row;

	//初始化一個圖為row=row+2 col=col+2; 
	init(row,col);
	
	//初始化 
	int x=1;
	int y=1;
	//標記當前點訪問過 
	map[x][y].flage=1;
	//記錄步數 
	int k=1;
	//記錄當前當前權重和
	int sum=0; 
	
	
	dfs(sum,x,y,k);
	cout<<result;
	
	

	
	
	
	return 0;
}