題目:
如【圖1.jpg】, 有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連著的。 (僅僅連線乙個角不算相連)
比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。
正確答案在下面!!
(錯誤答案大神們請無視….)
wrong answer:
錯因:這道題是不能邊用dfs邊判斷,
比如圖3的情況就不能考慮到:第2行第1列的格仔可以選,
但是我寫的**裡面就不能選,因為它的上面和左面的格仔都沒有被選過
而且!!我一開始的判斷**是錯的,因為我判斷了它左上角和右上角的格仔,大概是判斷**寫習慣了
搞了好幾天才終於知道錯誤原因,( ! ^ ! )
//剪郵票
//wrong answer
#include
using
namespace
std;
int cnt = 0;
bool selected[5][5];
int row,col,num;//num:要剪下來的個數
bool alright(int x, int y,int cur)
//左面
if(yy >= 1)
return
false;
/*wrong answer
for(int dx = -1; dx <= 1; ++dx)}}
return false;
*/}void dfs(int x, int y,int cur)
if(cur < num && x > row) return ;
//選if(alright(x, y,cur))
//不選
selected[x][y] = false;
if(y == col) dfs(x + 1, 1, cur);
else dfs(x, y + 1, cur);
}int main()
}dfs(1,1,0);
cout
0;}
思路:
用dfs;遞迴深度為格仔數(3 * 4 = 12),每個格仔有兩種可能的選擇:選or不選,遞迴出口為已選擇的格仔數為5;應該是選完5個格仔後再判斷是否滿足上下左右相鄰的條件,不能邊選邊判斷;判斷1個連通塊包含的格仔數用普通遞迴ordfs(這裡我用的普通的遞迴)
ps:除錯是個好東西!輸出結果出錯時在dfs裡面多用下輸出除錯看看哪步出錯
答案:116
code:
//剪郵票 答案:116
#include
using
namespace
std;
int cnt = 0;
int selected[5][5];
int row,col,num;//num:要剪下來的個數
bool vis[5][5];
int unitcnt = 0;
int move[4][2] = , ,, };
int getsum(int x, int y)
void dfs(int x, int y,int cur)
}if(flag) break;
}for(int k = 1; k <= row; ++k)
}// cout<
return ;
}if(cur < num && x > row) return ;
//選
selected[x][y] = 1;
if( y == col) dfs(x + 1,1,cur + 1);
else dfs(x, y + 1, cur + 1);
selected[x][y] = 0;
//不選
selected[x][y] = 0;
if(y == col) dfs(x + 1, 1, cur);
else dfs(x, y + 1, cur);
}int main()
}dfs(1,1,0);
cout
0;}
藍橋杯 剪郵票
剪郵票如 圖1.jpg 有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,圖2.jpg 圖3.jpg 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多...
藍橋杯 剪郵票
這道題,第一眼看知道是從12個數中選擇5個,然後dfs,但是就是不知道怎麼寫才好,看了一些別人寫的,大部分都是用c c 寫的,參考別人的,再自己修改,寫了這樣的,應該算是很好理解的,附上參考的package lanqiaocuprealtest 這裡也和別人的一樣,把數字改過了,5,6,7,8,改為...
藍橋杯 剪郵票
如 圖1.jpg 有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,圖2.jpg 圖3.jpg 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多餘的內...