2013藍橋杯c語言C組第10題
阿新 • • 發佈:2019-01-12
標題:剪格子
如圖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; }