今天刷了兩個拖了好幾天的題,寫完發現好簡單,網路上有好幾種方法,列舉,bfs...我只會暴力列舉+bfs(最簡單的)(/ □ \)。
hdu 1753flip game
題目的大概意思就是給乙個棋盤,例如
bwbw
bwww
wwwb
wwwb (b指black,w指white五五開)
可以翻轉乙個棋子,而且棋子的周圍(上下左右)都會翻轉,問至少翻轉多少次可以將棋盤變成純色(純黑或者純白)
思路:因為每個棋子翻轉0次和翻轉2次,即翻轉偶數次是一樣的結果。奇數同理。
棋盤為4✖4,所以有16個棋子,我們可以列舉只翻轉棋子的數目0~16.
一共會列舉
**如下:
#include#include using namespace std;
#includeint chess[16+5][16+5];
bool flag=0;
int step; //列舉步數,從0~16步
int rf[5]=; //上,右,下,左,自身 行
int cf[5] = ;//上,右,下,左,自身 列
bool isover()
void fz(int r,int c)
}void bfs(int r,int c,int deep)
if(flag || r==5) //flag==1已經完成,row==5已經出棋盤
fz(r,c); //翻轉
if(c<4)
else
fz(r,c); //假如第乙個不翻轉,就將第乙個翻轉回原樣
if(c<4)
else
return; }
int main()
getchar();
} for(int i=0;i<=16;i++)
if(flag)
printf("%d\n",step);
else
printf("impossible\n");
return 0;
}
hdu 2965
這題和上面的翻轉棋子類似,只是翻轉冰箱的門把手,一共16個門把手,也是可以翻轉一次,但是這次如果翻轉第i行,第j列的門把手,整個行和整個列的門把手都會被翻轉。只不過這次不僅要輸出最小步數,還要輸出每步翻轉的地方是那裡。
思路:我們可以類似上面的方法列舉看,只要在改變判flag 的條件,然後在翻轉的時候用乙個陣列記錄一下i,j行列就好了。**和上面很像。
**如下:
#include#include#define maxn 1000000
int door[4+5][4+5];
bool flag=false;
int num=0,step=0; //num用於記錄開關的過程,兩個為乙個位置 ,step用於列舉步數
int s[maxn]; //記錄開關門的過程
bool isover()
return true;
} void fz(int r,int c,int x) //r是行,c是列
door[r][c]=!door[r][c];
}void dfs(int r,int c,int deep)
if(flag||r>=5)
fz(r,c,deep);
if(c<4)
dfs(r,c+1,deep+1);
else
dfs(r+1,1,deep+1);
fz(r,c,deep);
if(c<4)
dfs(r,c+1,deep);
else
dfs(r+1,1,deep);
return ;
}int main()
getchar();
} /*for(int i=1;i<=4;i++)
printf("\n");
}*/for(int i=0;i<=16;i++)
if(flag)
}else
printf("impossible\n");
return 0;
}
emmm藍橋杯,校賽,省賽在即,希望自己能加油多刷一點題! 列舉法 acm辦公室的故事
都知道實驗室裡小袁,小劉,小邊是非常非常好的好朋友,最近這三個人在實驗室感覺非常的無聊,於是小袁想出了乙個點子來測試一下他們的默契程度,他讓小劉,小邊,還有他自己都拿乙個矩形的木板,如果這三個木板能拼成乙個正方形,代表著他們很有默契,如果不能,那麼就沒有默契。小袁很愁,因為這個問題已經難道他們三個了...
程式設計演算法之列舉法
列舉法是程式設計裡常用的演算法之一,依賴於計算機的強大計算能力來窮盡沒一種可能的情況,從而達到解決問題的目的,改演算法效率並不高,但適用於一些沒有明顯規律可循的環境。在小學奧數中經常會看到一些填數字的遊戲,如下圖 演算法描述題 算 題題題題題題 從上圖可看出,共有5個漢字 算,法,描,述,題 每個漢...
學習日記 列舉
知識點 列舉 列舉自定義屬性 位標誌 效果圖 提要 1.類標記 flags 2.定義特性 setarrtibute 北京 五一 descriptionattribute 北京 flags public enum enumstate 定義列舉 1.轉為陣列並獲取 getcustomattributes...