搜索zhuanti
I - Lake Counting
?由于最近的降雨,農(nóng)夫約翰的農(nóng)田里形成了不同位置的水塘。農(nóng)田被表示為一個(gè)矩形,它包含了 N x M (1 <= N <= 100; 1 <= M <= 100) 個(gè)小方格。每個(gè)方格中,要么包含了水 ('W'),要么包含了旱地 ('.')。農(nóng)夫約翰想要弄清楚,他的農(nóng)田中形成了多少個(gè)水塘。一個(gè)水塘是由包含了水的方格連通而成,這里一個(gè)方格被視作與周?chē)娜堪藗€(gè)方格相鄰。?
給出農(nóng)夫約翰的農(nóng)田數(shù)據(jù)圖,判斷圖中有多少個(gè)水塘。
輸入
* 第一行:兩個(gè)以空格分隔的整數(shù): N 和 M?
* 第 2..N+1 行:每行 M 個(gè)字符,表示農(nóng)夫約翰的農(nóng)田中的一行。每個(gè)字符要么是 'W' 要么是 '.'。字符之間沒(méi)有空格。
輸出
* 第一行:農(nóng)夫約翰的農(nóng)田中,水塘的數(shù)量。
示例輸入
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.示例輸出
3提示
輸出細(xì)節(jié):?
有 3 個(gè)水塘:一個(gè)位于左上方,一個(gè)位于左下方,還有一個(gè)位于右邊。
Sponsor
#include <iostream> #include <vector> using namespace std;//深度優(yōu)先搜索,從x,y這一點(diǎn)向周?chē)藗€(gè)點(diǎn)搜索 void DFS(vector<vector<char> >& g,int n,int m,int x,int y) {//每次向周?chē)阉髑?#xff0c;先將x,y這點(diǎn)置為'.',可以理解為遍歷過(guò)就當(dāng)作是干地,下次不再遍歷g[x][y] = '.';//向周?chē)藗€(gè)點(diǎn)開(kāi)始搜索for (int i = -1; i <= 1; i++) //i = -1的意思是,從(x,y)點(diǎn)的最左邊開(kāi)始搜索{for (int j = -1; j <= 1; j++) //j = -1 的意思是,從(x,y)點(diǎn)的最上邊開(kāi)始搜索{//先判斷是否超過(guò)范圍,再判斷是否是水池‘W’,如果是,則以這一點(diǎn)繼續(xù)深搜if (x + i >= 0 && x + i < n && y + j >= 0 && y + j < m && g[x + i][y + j] == 'W')DFS(g, n, m, x + i, y + j);}}}//求水洼數(shù)量 int LakeCounting(vector<vector<char> >& g,int n,int m) {int res = 0;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (g[i][j] == 'W'){DFS(g,n,m,i,j); //這里的DFS調(diào)用相當(dāng)于搜索極大連通圖,DFS里面的是小連通圖++res; //極大連通圖的數(shù)量就是水洼的數(shù)量}}}return res; }int main() {int n = 0, m = 0;cin >> n >> m;vector<vector<char> > g(n);//輸入for (int i = 0; i < n; i++){g[i].resize(m);for (int j = 0; j < m; j++)cin >> g[i][j];}//輸出的cout << LakeCounting(g,n,m) << endl;return 0; }A - 棋盤(pán)問(wèn)題
在一個(gè)給定形狀的棋盤(pán)(形狀可能是不規(guī)則的)上面擺放棋子,棋子沒(méi)有區(qū)別。要求擺放時(shí)任意的兩個(gè)棋子不能放在棋盤(pán)中的同一行或者同一列,請(qǐng)編程求解對(duì)于給定形狀和大小的棋盤(pán),擺放k個(gè)棋子的所有可行的擺放方案C。
Input
輸入含有多組測(cè)試數(shù)據(jù)。?
每組數(shù)據(jù)的第一行是兩個(gè)正整數(shù),n k,用一個(gè)空格隔開(kāi),表示了將在一個(gè)n*n的矩陣內(nèi)描述棋盤(pán),以及擺放棋子的數(shù)目。 n <= 8 , k <= n?
當(dāng)為-1 -1時(shí)表示輸入結(jié)束。?
隨后的n行描述了棋盤(pán)的形狀:每行有n個(gè)字符,其中 # 表示棋盤(pán)區(qū)域, . 表示空白區(qū)域(數(shù)據(jù)保證不出現(xiàn)多余的空白行或者空白列)。?
Output
對(duì)于每一組數(shù)據(jù),給出一行輸出,輸出擺放的方案數(shù)目C (數(shù)據(jù)保證C<2^31)。
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1Sample Output
2 1 #include <iostream> using namespace std; int visited[10]; char a[10][10]; int cnt ,num,n,k; void dfs(int r) {if(num == k) //如果棋子數(shù)達(dá)到k,那么計(jì)數(shù)器加一,并返回。{cnt++;return;}if(r >= n) return;//判斷邊界。for(int j = 0;j < n; j++){if(!visited[j] && a[r][j] == '#')//如果符合條件,則該位置可放棋子。{visited[j] = 1;num++; //標(biāo)記為已訪問(wèn),棋子數(shù)加一。dfs(r+1);//深搜下一行visited[j] = 0;//如果深搜失敗或者棋子數(shù)目夠了,則撤銷(xiāo)標(biāo)記。num--;} }dfs(r+1);//該行已經(jīng)有棋子,深搜下一行。 } int main(){while(cin>>n>>k&&n != -1&&k != -1){for(int i = 0; i < n; i++)for(int j = 0 ; j < n; j++)cin>>a[i][j];cnt = num = 0;//別忘記每次都要初始化,這是多樣例題。dfs(0);//從第一行開(kāi)始深搜。cout<<cnt<<endl;}return 0; }B - Perket
?
你有?NN?種配料,每種配料有酸度?SS?和苦度?BB?。用這些配料做成Perket時(shí),總的酸度為所有配料酸度的乘積,總的苦度是所有配料苦度的和。你至少需要添加一種配料。
為了使口感適中,總的酸度和苦度之差的絕對(duì)值應(yīng)該盡可能小,求這個(gè)最小值。
輸入
第一行?11?個(gè)整數(shù)?N \ (1\le N\le 10)N?(1≤N≤10)?—— 配料的數(shù)量。
接下來(lái)?NN?行每行?22?個(gè)整數(shù)?S_iSi??和?B_iBi??—— 每種配料的酸度和苦度。如果用所有配料來(lái)做Perket,總的酸度和苦度都?\le 10^9≤109?。
輸出
NN?行,每行?11?個(gè)整數(shù) —— 所求的最小值。
| 1 3 10 | 7 |
| 2 3 8 5 8 | 1 |
| 4 1 7 2 6 3 8 4 9 | 1 |
C - 全排列
?
給定一個(gè)由不同的小寫(xiě)字母組成的字符串,輸出這個(gè)字符串的所有全排列。 我們假設(shè)對(duì)于小寫(xiě)字母有 'a' < 'b' < ... < 'y' < 'z',而且給定的字符串中的字母已經(jīng)按照從小到大的順序排列。
輸入格式
輸入只有一行,是一個(gè)由不同的小寫(xiě)字母組成的字符串,已知字符串的長(zhǎng)度在?11?到?66?之間。
輸出格式
輸出這個(gè)字符串的所有排列方式,每行一個(gè)排列。要求字母序比較小的排列在前面。字母序如下定義:
已知?S = s_1s_2...s_k, T = t_1t_2...t_kS=s1?s2?...sk?,T=t1?t2?...tk?,則?S < TS<T?等價(jià)于,存在?p (1 \le p \le k)p(1≤p≤k),使得?s_1 = t_1, s_2 = t_2, ..., s_{p - 1} = t_{p - 1}, s_p < t_ps1?=t1?,s2?=t2?,...,sp?1?=tp?1?,sp?<tp??成立。
Sample Input
abcSample Output
abc acb bac bca cab cba #include<bits/stdc++.h> using namespace std; int main() {char s[66];cin>>s;do{for(int i=0;i<strlen(s);i++)cout<<s[i];cout<<endl;}while(next_permutation(s,s+strlen(s)));return 0; }D - 自然數(shù)拆分
對(duì)于任意大于?11?的自然數(shù)?nn,總是可以拆分成若干個(gè)小于?nn?的自然數(shù)之和。
現(xiàn)請(qǐng)你編寫(xiě)程序求出?nn?的所有拆分。
輸入格式
輸入文件共一行,包含一個(gè)自然數(shù),即要拆分的自然數(shù)?n(1 \le n \le 20)n(1≤n≤20)。
輸出格式
輸出文件有若干行,每行包含一個(gè)等式,即代表一種可行的拆分(格式與順序參見(jiàn)樣例)。
Sample Input
5Sample Output
5=1+1+1+1+1 5=1+1+1+2 5=1+1+3 5=1+2+2 5=1+4 5=2+3?
#include<cstdio> using namespace std; int n; int old[50]; void dfs(int sum,int cur){if(sum>n) return;if(sum==n){printf("%d=",n);for(int i=1;i<cur;i++){printf("%d+",old[i]);}printf("%d\n",old[cur]);return;}for(int i=old[cur];i<n;i++){old[cur+1]=i;//這個(gè)值就是下一層遞歸時(shí)所用到的i的起始值,這里old數(shù)組記錄下來(lái)dfs(sum+i,cur+1);//進(jìn)入到下一層遞歸} } int main(){scanf("%d",&n);old[0]=1;dfs(0,0);return 0; }E - Prime Ring Problem
?
題意翻譯
輸入正整數(shù) n,把整數(shù) 1,2,…,n 排成一個(gè)環(huán),使得相鄰兩個(gè)整數(shù)之和均為素?cái)?shù)。輸出時(shí),從整數(shù) 1 開(kāi)始逆時(shí)針排列。同一個(gè)環(huán)恰好輸出一次。n≤16,保證一定有解。
多組數(shù)據(jù),讀入到EOF結(jié)束。
第 i 組數(shù)據(jù)輸出前加上一行Case i:
相鄰兩組輸出中間加上一個(gè)空行。
輸入樣例
6
8
輸出樣例
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
輸出格式提示
行末無(wú)空格
最后一個(gè)Case輸出后不換行
F - Red and Black
有一個(gè)長(zhǎng)方形的房間,覆蓋了正方形的磁磚。每塊磁磚的顏色,要么是紅色,要么是黑色。一名男子站在一塊黑色的磁磚上。他可以從一塊磁磚移至相鄰四塊磁磚中的某一塊。但是,他不允許在紅色磁磚上移動(dòng),他只允許在黑色磁磚上移動(dòng)。?
編寫(xiě)一個(gè)程序,使得他允許重復(fù)上述的移動(dòng),判斷他所能到達(dá)的黑色磁磚的數(shù)量。?
輸入
輸入由多個(gè)數(shù)據(jù)集組成。數(shù)據(jù)集的起始行包含了兩個(gè)正整數(shù) W 和 H;W 和 H 分別是 x- 和 y- 方向的磁磚數(shù)量。W 和 H 不超過(guò) 20 。?
在數(shù)據(jù)集中,還有 H 行,每行包含了 W 個(gè)字符。每個(gè)字符按如下方式表示一塊磁磚的顏色。?
'.' - 一塊黑色的磁磚?
'#' - 一塊紅色的磁磚?
'@' - 一名男子,站在一塊黑色磁磚上 (在一個(gè)數(shù)據(jù)集中,恰好出現(xiàn)一次)?
以包含兩個(gè) 0 的一行,表示輸入結(jié)束。?
輸出
對(duì)于每個(gè)數(shù)據(jù)集,程序應(yīng)當(dāng)輸出一行,包含他從初始磁磚所能抵達(dá)的磁磚數(shù)量 (包括初始磁磚自身)。
示例輸入
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0示例輸出
45 59 6 13 #include<stdio.h> #include<string.h> int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; char a[30][30]; int book[30][30]; int i,j,w,h,x,y,s; void dfs(int x,int y); int main() {while(scanf("%d%d",&w,&h)!=EOF){memset(a,0,sizeof(a));memset(book,0,sizeof(book));s=1;for(i=0;i<h;i++)scanf("%s",a[i]);if(w==0&&h==0)break;for(i=0;i<h;i++)for(j=0;j<w;j++)if(a[i][j]=='@'){x=i;y=j;}dfs(x,y);printf("%d\n",s);} } void dfs(int x,int y) {int k,tx,ty;for(k=0;k<4;k++){tx=x+next[k][0];ty=y+next[k][1];if(tx>=0&&tx<h&&ty>=0&&ty<w&&book[tx][ty]==0&&a[tx][ty]=='.'){s++;book[tx][ty]=1;dfs(tx,ty);}} }G - Knight Moves
?
題目描述
原題來(lái)自:POJ 1915
題目描述
原題來(lái)自:POJ 1915
編寫(xiě)一個(gè)程序,計(jì)算一個(gè)騎士從棋盤(pán)上的一個(gè)格子到另一個(gè)格子所需的最小步數(shù)。騎士一步可以移動(dòng)到的位置由下圖給出。
輸入格式
第一行給出騎士的數(shù)量?nn。?
在接下來(lái)的?3n3n?行中,每?33?行描述了一個(gè)騎士。其中,
- 第一行一個(gè)整數(shù)?LL?表示棋盤(pán)的大小,整個(gè)棋盤(pán)大小為?L\times LL×L;
- 第二行和第三行分別包含一對(duì)整數(shù)?(x,y)(x,y),表示騎士的起始點(diǎn)和終點(diǎn)。假設(shè)對(duì)于每一個(gè)騎士,起始點(diǎn)和終點(diǎn)均合理。
輸出格式
對(duì)每一個(gè)騎士,輸出一行一個(gè)整數(shù)表示需要移動(dòng)的最小步數(shù)。如果起始點(diǎn)和終點(diǎn)相同,則輸出?00。
樣例
?
樣例
?
| 3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1 | 5 28 0 |
數(shù)據(jù)范圍與提示
對(duì)于?100\%100%?的數(shù)據(jù),有?4\le L\le 3004≤L≤300,保證?0\le x,y\le L-10≤x,y≤L?1
#include <bits/stdc++.h> using namespace std; int xx[]={-2,-2,-1,-1,1,1,2,2}; int yy[]={-1,1,-2,2,-2,2,-1,1}; int vis[300][300]; struct Node{int x;int y;int cnt; }; int main(){int n,L;cin>>n;int sx,sy,fx,fy;for(int i=0;i<n;i++){memset(vis,0,sizeof(vis));cin>>L;cin>>sx>>sy;cin>>fx>>fy;queue <Node> q;q.push((Node){sx,sy,0});while(!q.empty()){if(q.front().x==fx&&q.front().y==fy){cout<<q.front().cnt<<endl;break;}for(int i=0;i<8;i++){int dx=q.front().x+xx[i];int dy=q.front().y+yy[i];if(dx>=0&&dx<L&&dy>=0&&dy<L&&!vis[dx][dy]){q.push((Node){dx,dy,q.front().cnt+1});vis[dx][dy]=1;}}q.pop();}}return 0;}H - Oil Deposits
?
某公司負(fù)責(zé)探測(cè)地下油層,每次處理一個(gè)大的矩形區(qū)域。先創(chuàng)建一個(gè)網(wǎng)格,將土地劃分為許多方形塊,然后用傳感設(shè)備分別探測(cè)每個(gè)地塊,以確定該地塊是否含有石油。一塊含有石油的土地叫做pocket。如果兩個(gè)pocket邊相鄰或?qū)窍噜?#xff0c;則它們屬于同一油層的一部分。你的工作是確定在一個(gè)網(wǎng)格有多少不同的油層。
Input
輸入包含多組數(shù)據(jù)。每組數(shù)據(jù)都以包含m和n的一行開(kāi)始,m和n是網(wǎng)格中行和列的數(shù)量(1 <= m <= 100,1 <= n <= 100),由一個(gè)空格分隔。如果m = 0,則表示輸入結(jié)束。下面是m行,每行有n個(gè)字符(不包括行尾字符)。每個(gè)字符對(duì)應(yīng)一塊土地,要么是“*”,代表沒(méi)有油,要么是“@”,代表一個(gè)pocket。
Output
輸出網(wǎng)格有多少不同的油層。
Sample Input
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0Sample Output
0
1
2
2
J - 二叉樹(shù)先序遍歷
輸入一個(gè)整數(shù)n(n <= 100000),表示二叉樹(shù)中節(jié)點(diǎn)個(gè)數(shù),編號(hào)為1~n。約定1號(hào)節(jié)點(diǎn)為二叉樹(shù)的根節(jié)點(diǎn)。然后輸入n行,每行包括兩個(gè)整數(shù),第i行表示編號(hào)為i的節(jié)點(diǎn)的左子節(jié)點(diǎn)和右子節(jié)點(diǎn)的編號(hào)。如果某個(gè)節(jié)點(diǎn)沒(méi)有左子節(jié)點(diǎn),那么對(duì)應(yīng)輸行的第一個(gè)整數(shù)為0;如果某個(gè)節(jié)點(diǎn)沒(méi)有右子節(jié)點(diǎn),那么對(duì)應(yīng)行的第二個(gè)整數(shù)為0。
先序遍歷輸出此二叉樹(shù)每個(gè)節(jié)點(diǎn)的編號(hào),每行輸出一個(gè)編號(hào)。
先序遍歷(DLR),是二叉樹(shù)遍歷的一種,也叫做先根遍歷、前序遍歷、前序周游,可記做根左右。前序遍歷首先訪問(wèn)根節(jié)點(diǎn)然后遍歷左子樹(shù),最后遍歷右子樹(shù)。
Input
第一行:一個(gè)整數(shù)n 接下來(lái)n行,每行有兩個(gè)整數(shù)
Output
輸出n行,每行一個(gè)整數(shù),表示節(jié)點(diǎn)編號(hào)。
Sample Input
5 2 5 3 4 0 0 0 0 0 0Sample Output
1 2 3 4 5 #include <bits/stdc++.h> using namespace std; int n; const int MAX=1e5+10; int vis[MAX]; int r[MAX]; int l[MAX]; int b[MAX]; int cnt=1; void dfs(int t){b[cnt++]=t;if(l[t]){dfs(l[t]);}if(r[t]){dfs(r[t]);} } int main(){cin>>n;for(int i=1;i<=n;i++){cin>>l[i]>>r[i];}dfs(1);for(int i=1;i<cnt;i++){cout<<b[i]<<endl;}return 0; }K - 迷宮(一)
?
一天蒜頭君掉進(jìn)了一個(gè)迷宮里面,蒜頭君想逃出去,可憐的蒜頭君連迷宮是否有能逃出去的路都不知道。
看在蒜頭君這么可憐的份上,就請(qǐng)聰明的你告訴蒜頭君是否有可以逃出去的路。
輸入格式
第一行輸入兩個(gè)整數(shù)?nn?和?mm,表示這是一個(gè)?n \times mn×m?的迷宮。
接下來(lái)的輸入一個(gè)?nn?行?mm?列的迷宮。其中?'S'?表示蒜頭君的位置,'*'表示墻,蒜頭君無(wú)法通過(guò),'.'表示路,蒜頭君可以通過(guò)'.'移動(dòng),'T'表示迷宮的出口(蒜頭君每次只能移動(dòng)到四個(gè)與他相鄰的位置——上,下,左,右)。
輸出格式
輸出一個(gè)字符串,如果蒜頭君可以逃出迷宮輸出"yes",否則輸出"no"。
數(shù)據(jù)范圍
1 \le n, m \le 101≤n,m≤10
Sample Input 3 4 S**. ..*. ***TSample Output
noSample Input 2
3 4 S**. .... ***TSample Output 2
yes #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<map> #include<set> #include<string> #include<stack> #include<queue> #include<vector> #include<math.h> using namespace std; typedef long long int ll; const int maxn=300; const int inf=1e7; int n,m; char dt[15][15]; int vis[15][15]; int flag=0; int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; bool pd(int x,int y)//判斷路是否能走 {return x>=1&&x<=n&&y>=1&&y<=m&&dt[x][y]!='*'&&vis[x][y]==0; } void dfs(int x,int y) {if(dt[x][y]=='T')//終點(diǎn)就退出 {flag=1;return ;}if(!pd(x,y)) return ;vis[x][y]=1;for(int i=0;i<4;i++){int nx=x+dir[i][0];int ny=y+dir[i][1];dfs(nx,ny);}return ; } int main() {int sx,sy;cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>dt[i][j];if(dt[i][j]=='S'){sx=i;sy=j;}}}dfs(sx,sy);if(flag==1) cout<<"yes"<<endl;else cout<<"no"<<endl; }L - 馬走日
?
馬在中國(guó)象棋以日字形規(guī)則移動(dòng)。請(qǐng)編寫(xiě)一段程序,給定n*m大小的棋盤(pán),以及馬的初始位置(x,y),要求不能重復(fù)經(jīng)過(guò)棋盤(pán)上的同一個(gè)點(diǎn),計(jì)算馬可以有多少途徑遍歷棋盤(pán)上的所有點(diǎn)。
Input
第一行為整數(shù)T(T < 10),表示測(cè)試數(shù)據(jù)組數(shù)。每一組測(cè)試數(shù)據(jù)包含一行,為四個(gè)整數(shù),分別為棋盤(pán)的大小以及初始位置坐標(biāo)n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 6, n < 6)
Output
每組測(cè)試數(shù)據(jù)包含一行,為一個(gè)整數(shù),表示馬能遍歷棋盤(pán)的途徑總數(shù),0為無(wú)法遍歷一次。
Sample Input
1 5 4 0 0Sample Output
32 #include <iostream> #include <cstring> using namespace std;const int N = 11; int vis[N][N], n, m, x0, y0, nm, ans = 0; int dir[8][2] = {{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};void dfs(int x, int y, int steps) {if (steps == nm) {ans++;return;} else {for (int i = 0; i < 8; ++i) {int tmpx = x + dir[i][0];int tmpy = y + dir[i][1];if (tmpx >= 0 && tmpy >= 0 && tmpx < n && tmpy < m && !vis[tmpx][tmpy]) {vis[tmpx][tmpy] = 1;dfs(tmpx, tmpy, steps + 1);vis[tmpx][tmpy] = 0;}}} }int main() {int t;scanf("%d", &t);while (t--) {memset(vis, 0, sizeof(vis));scanf("%d%d%d%d", &n, &m, &x0, &y0);nm = n * m, ans = 0;vis[x0][y0] = 1;dfs(x0, y0, 1);printf("%d\n", ans);}return 0; }M - 八皇后問(wèn)題
?
努比亞和蘇丹沒(méi)有子女,所以他要從一些有集成資格的繼承者中挑選一個(gè)出來(lái)繼承王位。他希望這個(gè)繼承者足夠聰明,所以他準(zhǔn)備了一個(gè)西洋棋盤(pán),上面的每個(gè)格子中均有一個(gè)?1-991?99?的數(shù)字。他又準(zhǔn)備了?88?個(gè)皇后棋子。
88?皇后的規(guī)則就是不能有任何棋子同行或者同列或者同斜線,在滿足這個(gè)規(guī)則的同時(shí),王位繼承者還需要讓?88?個(gè)皇后所在的位置的數(shù)字的和是最大的。
輸入格式
輸入一個(gè)數(shù)字?k(k\leq 20)k(k≤20),代表棋盤(pán)的數(shù)量。
接下來(lái)有?kk?個(gè)棋盤(pán),每個(gè)棋盤(pán)有?6464?個(gè)數(shù)字,分成?88?行?88?列出入,具體可見(jiàn)樣例,每一個(gè)數(shù)字均小于?100100。
輸出格式
每一個(gè)棋盤(pán)對(duì)應(yīng)輸出最大的數(shù)值, 一共輸出?kk?行。
Sample Input
11 2 3 4 5 6 7 89 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64Sample Output
260 #include <bits/stdc++.h> using namespace std; int mp[10][10]; int lie[10]; int rl[30]; int lr[30]; int MAX=-1; int sum=0; void dfs(int t){if(t>8){MAX=max(MAX,sum);return ;}for(int i=1;i<=8;i++){if(!lie[i]&&!rl[t+i]&&!lr[i-t+8]){lie[i]=1;rl[t+i]=1;lr[i-t+8]=1;sum+=mp[t][i];dfs(t+1);sum-=mp[t][i];lie[i]=0;rl[t+i]=0;lr[i-t+8]=0;}} } int main(){int k;cin>>k;while(k--){MAX=-1;sum=0;memset(lie,0,sizeof(lie));memset(rl,0,sizeof(lie));memset(lr,0,sizeof(lie));for(int i=1;i<=8;i++){for(int j=1;j<=8;j++){cin>>mp[i][j];}}dfs(1);cout<<MAX<<endl;}return 0; }N - 選數(shù)
已知?nn?個(gè)整數(shù)?x_1,x_2,\cdots,x_nx1?,x2?,?,xn?,以及一個(gè)整數(shù)?kk(k<nk<n)。從?nn?個(gè)整數(shù)中任選?kk?個(gè)整數(shù)相加,可分別得到一系列的和。例如當(dāng)?n=4n=4,k=3k=3,44?個(gè)整數(shù)分別為?33,77,1212,1919?時(shí),可得全部的組合與它們的和為:
3+7+12=223+7+12=22
3+7+19=293+7+19=29
7+12+19=387+12+19=38
3+12+19=343+12+19=34
現(xiàn)在,要求你計(jì)算出和為素?cái)?shù)共有多少種。
例如上例,只有一種的和為素?cái)?shù):3+7+19=293+7+19=29。
輸入格式
輸入格式為:nn,kk(1 \le n \le 20,k<n1≤n≤20,k<n)。
x_1,x_2,\cdots,x_nx1?,x2?,?,xn?(1 \le x_i \le 50000001≤xi?≤5000000)。
輸出格式
輸出格式為:一個(gè)整數(shù)(滿足條件的種數(shù))。
Sample Input
4 3 3 7 12 19Sample Output
1 #include<iostream> #include<math.h> using namespace std; int x[20],n,k;//依照題目所設(shè) bool isprime(int n){//判斷是否質(zhì)數(shù)int s=sqrt(double(n));for(int i=2;i<=s;i++){if(n%i==0)return false;}return true; } int rule(int choose_left_num,int already_sum,int start,int end){//choose_left_num為剩余的k,already_sum為前面累加的和,start和end為全組合剩下數(shù)字的選取范圍;調(diào)用遞歸生成全組合,在過(guò)程中逐漸把K個(gè)數(shù)相加,當(dāng)選取的數(shù)個(gè)數(shù)為0時(shí),直接返回前面的累加和是否為質(zhì)數(shù)即可if(choose_left_num==0)return isprime(already_sum);int sum=0;for(int i=start;i<=end;i++){sum+=rule(choose_left_num-1,already_sum+x[i],i+1,end);}return sum; } int main(){cin>>n>>k;for(int i =0;i<n;i++)cin>>x[i];cout<<rule(k,0,0,n-1);//調(diào)用遞歸解決問(wèn)題 }O - 打開(kāi)燈泡 Switch the Lamp On
達(dá)達(dá)是來(lái)自異世界的魔女,她在漫無(wú)目的地四處漂流的時(shí)候,遇到了善良的少女翰翰,從而被收留在地球上。
翰翰的家里有一輛飛行車(chē)。
有一天飛行車(chē)的電路板突然出現(xiàn)了故障,導(dǎo)致無(wú)法啟動(dòng)。
電路板的整體結(jié)構(gòu)是一個(gè)R行C列的網(wǎng)格(R,C≤500),如下圖所示。
每個(gè)格點(diǎn)都是電線的接點(diǎn),每個(gè)格子都包含一個(gè)電子元件。
電子元件的主要部分是一個(gè)可旋轉(zhuǎn)的、連接一條對(duì)角線上的兩個(gè)接點(diǎn)的短電纜。
在旋轉(zhuǎn)之后,它就可以連接另一條對(duì)角線的兩個(gè)接點(diǎn)。
電路板左上角的接點(diǎn)接入直流電源,右下角的接點(diǎn)接入飛行車(chē)的發(fā)動(dòng)裝置。
達(dá)達(dá)發(fā)現(xiàn)因?yàn)槟承┰姆较虿恍⌒陌l(fā)生了改變,電路板可能處于斷路的狀態(tài)。
她準(zhǔn)備通過(guò)計(jì)算,旋轉(zhuǎn)最少數(shù)量的元件,使電源與發(fā)動(dòng)裝置通過(guò)若干條短纜相連。
不過(guò),電路的規(guī)模實(shí)在是太大了,達(dá)達(dá)并不擅長(zhǎng)編程,希望你能夠幫她解決這個(gè)問(wèn)題。
注意:只能走斜向的線段,水平和豎直線段不能走。
Input
對(duì)于每組測(cè)試數(shù)據(jù),第一行包含正整數(shù)R和C,表示電路板的行數(shù)和列數(shù)。
之后R行,每行C個(gè)字符,字符是"/"和"\"中的一個(gè),表示標(biāo)準(zhǔn)件的方向。
Output
對(duì)于每組測(cè)試數(shù)據(jù),在單獨(dú)的一行輸出一個(gè)正整數(shù),表示所需的縮小旋轉(zhuǎn)次數(shù)。
如果無(wú)論怎樣都不能使得電源和發(fā)動(dòng)機(jī)之間連通,輸出NO SOLUTION。
Example
樣例輸入
3 5 \\/\\ \\/// /\\\\樣例輸出
1Hint
1≤R,C≤500,
1≤T≤5
?
總結(jié)
- 上一篇: 企业合同协议大全1740个
- 下一篇: 利用Bing Search API进行搜