日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

搜索zhuanti

發布時間:2024/1/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搜索zhuanti 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

I - Lake Counting

?由于最近的降雨,農夫約翰的農田里形成了不同位置的水塘。農田被表示為一個矩形,它包含了 N x M (1 <= N <= 100; 1 <= M <= 100) 個小方格。每個方格中,要么包含了水 ('W'),要么包含了旱地 ('.')。農夫約翰想要弄清楚,他的農田中形成了多少個水塘。一個水塘是由包含了水的方格連通而成,這里一個方格被視作與周圍的全部八個方格相鄰。?

給出農夫約翰的農田數據圖,判斷圖中有多少個水塘。

輸入

* 第一行:兩個以空格分隔的整數: N 和 M?

* 第 2..N+1 行:每行 M 個字符,表示農夫約翰的農田中的一行。每個字符要么是 'W' 要么是 '.'。字符之間沒有空格。

輸出

* 第一行:農夫約翰的農田中,水塘的數量。

示例輸入

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

提示

輸出細節:?

有 3 個水塘:一個位于左上方,一個位于左下方,還有一個位于右邊。

Sponsor

#include <iostream> #include <vector> using namespace std;//深度優先搜索,從x,y這一點向周圍八個點搜索 void DFS(vector<vector<char> >& g,int n,int m,int x,int y) {//每次向周圍搜索前,先將x,y這點置為'.',可以理解為遍歷過就當作是干地,下次不再遍歷g[x][y] = '.';//向周圍八個點開始搜索for (int i = -1; i <= 1; i++) //i = -1的意思是,從(x,y)點的最左邊開始搜索{for (int j = -1; j <= 1; j++) //j = -1 的意思是,從(x,y)點的最上邊開始搜索{//先判斷是否超過范圍,再判斷是否是水池‘W’,如果是,則以這一點繼續深搜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);}}}//求水洼數量 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調用相當于搜索極大連通圖,DFS里面的是小連通圖++res; //極大連通圖的數量就是水洼的數量}}}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 - 棋盤問題

在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對于給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。

Input

輸入含有多組測試數據。?
每組數據的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n?
當為-1 -1時表示輸入結束。?
隨后的n行描述了棋盤的形狀:每行有n個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多余的空白行或者空白列)。?

Output

對于每一組數據,給出一行輸出,輸出擺放的方案數目C (數據保證C<2^31)。

Sample Input

2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1

Sample 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) //如果棋子數達到k,那么計數器加一,并返回。{cnt++;return;}if(r >= n) return;//判斷邊界。for(int j = 0;j < n; j++){if(!visited[j] && a[r][j] == '#')//如果符合條件,則該位置可放棋子。{visited[j] = 1;num++; //標記為已訪問,棋子數加一。dfs(r+1);//深搜下一行visited[j] = 0;//如果深搜失敗或者棋子數目夠了,則撤銷標記。num--;} }dfs(r+1);//該行已經有棋子,深搜下一行。 } 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);//從第一行開始深搜。cout<<cnt<<endl;}return 0; }

B - Perket

?

你有?NN?種配料,每種配料有酸度?SS?和苦度?BB?。用這些配料做成Perket時,總的酸度為所有配料酸度的乘積,總的苦度是所有配料苦度的和。你至少需要添加一種配料。

為了使口感適中,總的酸度和苦度之差的絕對值應該盡可能小,求這個最小值。

輸入

第一行?11?個整數?N \ (1\le N\le 10)N?(1≤N≤10)?—— 配料的數量。

接下來?NN?行每行?22?個整數?S_iSi??和?B_iBi??—— 每種配料的酸度和苦度。如果用所有配料來做Perket,總的酸度和苦度都?\le 10^9≤109?。

輸出

NN?行,每行?11?個整數 —— 所求的最小值。

Sample Input 1Sample Output 1
1 3 10 7
Sample Input 2Sample Output 2
2 3 8 5 8 1
Sample Input 3Sample Output 3
4 1 7 2 6 3 8 4 9 1

#include<bits/stdc++.h> #define REP(i, a, b) for(int i = (a); i <= (b); ++ i) #define REP(j, a, b) for(int j = (a); j <= (b); ++ j) #define PER(i, a, b) for(int i = (a); i >= (b); -- i) using namespace std; const int maxn = 1e5 + 5; template <class T> inline void rd(T &ret) {char c;ret = 0;while ((c = getchar()) < '0' || c > '9');while (c >= '0' && c <= '9') {ret = ret * 10 + (c - '0'), c = getchar();} } struct node {int sweet, sour; }p[maxn]; int n,ans=0x3f3f3f3f; void dfs(int cur, int totsweet, int totsour) {if (cur > n) {if (totsweet == 0)return;if (abs(totsweet-totsour) < ans)ans = abs(totsweet - totsour);return;}dfs(cur + 1, totsweet + p[cur].sweet, totsour*p[cur].sour);dfs(cur + 1, totsweet, totsour);return; } int main() {rd(n);REP(i, 1, n) {scanf("%d%d", &p[i].sour, &p[i].sweet);}dfs(1, 0, 1);cout << ans << endl;return 0; }

C - 全排列

?

給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對于小寫字母有 'a' < 'b' < ... < 'y' < 'z',而且給定的字符串中的字母已經按照從小到大的順序排列。

輸入格式

輸入只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在?11?到?66?之間。

輸出格式

輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:

已知?S = s_1s_2...s_k, T = t_1t_2...t_kS=s1?s2?...sk?,T=t1?t2?...tk?,則?S < TS<T?等價于,存在?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

abc

Sample 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 - 自然數拆分

對于任意大于?11?的自然數?nn,總是可以拆分成若干個小于?nn?的自然數之和。

現請你編寫程序求出?nn?的所有拆分。

輸入格式

輸入文件共一行,包含一個自然數,即要拆分的自然數?n(1 \le n \le 20)n(1≤n≤20)。

輸出格式

輸出文件有若干行,每行包含一個等式,即代表一種可行的拆分(格式與順序參見樣例)。

Sample Input

5

Sample 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;//這個值就是下一層遞歸時所用到的i的起始值,這里old數組記錄下來dfs(sum+i,cur+1);//進入到下一層遞歸} } int main(){scanf("%d",&n);old[0]=1;dfs(0,0);return 0; }

E - Prime Ring Problem

?

題意翻譯

輸入正整數 n,把整數 1,2,…,n 排成一個環,使得相鄰兩個整數之和均為素數。輸出時,從整數 1 開始逆時針排列。同一個環恰好輸出一次。n≤16,保證一定有解。

多組數據,讀入到EOF結束。

第 i 組數據輸出前加上一行Case i:

相鄰兩組輸出中間加上一個空行。

輸入樣例

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

輸出格式提示

行末無空格
最后一個Case輸出后不換行

#include <iostream> #include <cmath> #include <cstring> #include <cstdio> using namespace std;int n; int ans[40]; bool vis[40];void pr() {for(int i = 1; i <= n - 1; i++){cout << ans[i] << ' ';}cout << ans[n] << endl; }bool isPrime(int x) {bool flag = true;for(int i = 2; i <= sqrt(x); i++){if(x % i == 0)flag = false;}return flag; }void dfs(int step) {if(step > n && isPrime(ans[1] + ans[n])){pr();return ;}for(int i = 2; i <= n; i++){ans[step] = i;if(vis[i] || isPrime(ans[step] + ans[step - 1]) == 0)continue;vis[i] = 1;dfs(step + 1);vis[i] = 0;} }int main() {int j = 1;while(cin >> n){if(j >= 2)cout << endl;memset(ans, 0, sizeof ans);memset(vis, 0, sizeof vis);printf("Case %d:\n", j);j++;vis[1] = 1;ans[1] = 1;dfs(2);}return 0; }

F - Red and Black

有一個長方形的房間,覆蓋了正方形的磁磚。每塊磁磚的顏色,要么是紅色,要么是黑色。一名男子站在一塊黑色的磁磚上。他可以從一塊磁磚移至相鄰四塊磁磚中的某一塊。但是,他不允許在紅色磁磚上移動,他只允許在黑色磁磚上移動。?

編寫一個程序,使得他允許重復上述的移動,判斷他所能到達的黑色磁磚的數量。?

輸入

輸入由多個數據集組成。數據集的起始行包含了兩個正整數 W 和 H;W 和 H 分別是 x- 和 y- 方向的磁磚數量。W 和 H 不超過 20 。?

在數據集中,還有 H 行,每行包含了 W 個字符。每個字符按如下方式表示一塊磁磚的顏色。?

'.' - 一塊黑色的磁磚?
'#' - 一塊紅色的磁磚?
'@' - 一名男子,站在一塊黑色磁磚上 (在一個數據集中,恰好出現一次)?

以包含兩個 0 的一行,表示輸入結束。?

輸出

對于每個數據集,程序應當輸出一行,包含他從初始磁磚所能抵達的磁磚數量 (包括初始磁磚自身)。

示例輸入

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

?

題目描述

原題來自:POJ 1915

題目描述

原題來自:POJ 1915

編寫一個程序,計算一個騎士從棋盤上的一個格子到另一個格子所需的最小步數。騎士一步可以移動到的位置由下圖給出。

輸入格式

第一行給出騎士的數量?nn。?
在接下來的?3n3n?行中,每?33?行描述了一個騎士。其中,

  • 第一行一個整數?LL?表示棋盤的大小,整個棋盤大小為?L\times LL×L;
  • 第二行和第三行分別包含一對整數?(x,y)(x,y),表示騎士的起始點和終點。假設對于每一個騎士,起始點和終點均合理。

輸出格式

對每一個騎士,輸出一行一個整數表示需要移動的最小步數。如果起始點和終點相同,則輸出?00。

樣例

?

樣例

?

InputOutput
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1 5 28 0

數據范圍與提示

對于?100\%100%?的數據,有?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

?

某公司負責探測地下油層,每次處理一個大的矩形區域。先創建一個網格,將土地劃分為許多方形塊,然后用傳感設備分別探測每個地塊,以確定該地塊是否含有石油。一塊含有石油的土地叫做pocket。如果兩個pocket邊相鄰或對角相鄰,則它們屬于同一油層的一部分。你的工作是確定在一個網格有多少不同的油層。

Input

輸入包含多組數據。每組數據都以包含m和n的一行開始,m和n是網格中行和列的數量(1 <= m <= 100,1 <= n <= 100),由一個空格分隔。如果m = 0,則表示輸入結束。下面是m行,每行有n個字符(不包括行尾字符)。每個字符對應一塊土地,要么是“*”,代表沒有油,要么是“@”,代表一個pocket。

Output

輸出網格有多少不同的油層。

Sample Input

1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0

Sample Output

0
1
2
2

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std;int n,m; //int vis[105][105]; char yard[105][105];int check(int p,int q) {if(p<0 || p>=n || q<0 || q>=m)return 0; // if(vis[p][q]==1) // return 0;if(yard[p][q]=='@') return 1;return 0; }void dfs(int x,int y) { // vis[x][y]=1;yard[x][y]='*';for(int dx=-1;dx<=1;dx++){for(int dy=-1;dy<=1;dy++){int nx=x+dx,ny=y+dy;if(check(nx,ny)){dfs(nx,ny);}}} }int main() {while(scanf("%d %d",&n,&m)!=EOF){getchar();int summ=0;if(n==0&&m==0) break; // memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>yard[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(yard[i][j]=='@'){dfs(i,j);summ++;}}}printf("%d\n",summ);}return 0; }

J - 二叉樹先序遍歷

輸入一個整數n(n <= 100000),表示二叉樹中節點個數,編號為1~n。約定1號節點為二叉樹的根節點。然后輸入n行,每行包括兩個整數,第i行表示編號為i的節點的左子節點和右子節點的編號。如果某個節點沒有左子節點,那么對應輸行的第一個整數為0;如果某個節點沒有右子節點,那么對應行的第二個整數為0。
先序遍歷輸出此二叉樹每個節點的編號,每行輸出一個編號。

先序遍歷(DLR),是二叉樹遍歷的一種,也叫做先根遍歷、前序遍歷、前序周游,可記做根左右。前序遍歷首先訪問根節點然后遍歷左子樹,最后遍歷右子樹。

Input

第一行:一個整數n 接下來n行,每行有兩個整數

Output

輸出n行,每行一個整數,表示節點編號。

Sample Input

5 2 5 3 4 0 0 0 0 0 0

Sample 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 - 迷宮(一)

?

一天蒜頭君掉進了一個迷宮里面,蒜頭君想逃出去,可憐的蒜頭君連迷宮是否有能逃出去的路都不知道。

看在蒜頭君這么可憐的份上,就請聰明的你告訴蒜頭君是否有可以逃出去的路。

輸入格式

第一行輸入兩個整數?nn?和?mm,表示這是一個?n \times mn×m?的迷宮。

接下來的輸入一個?nn?行?mm?列的迷宮。其中?'S'?表示蒜頭君的位置,'*'表示墻,蒜頭君無法通過,'.'表示路,蒜頭君可以通過'.'移動,'T'表示迷宮的出口(蒜頭君每次只能移動到四個與他相鄰的位置——上,下,左,右)。

輸出格式

輸出一個字符串,如果蒜頭君可以逃出迷宮輸出"yes",否則輸出"no"。

數據范圍

1 \le n, m \le 101≤n,m≤10

Sample Input 3 4 S**. ..*. ***T

Sample Output

no

Sample Input 2

3 4 S**. .... ***T

Sample 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')//終點就退出 {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 - 馬走日

?

馬在中國象棋以日字形規則移動。請編寫一段程序,給定n*m大小的棋盤,以及馬的初始位置(x,y),要求不能重復經過棋盤上的同一個點,計算馬可以有多少途徑遍歷棋盤上的所有點。

Input

第一行為整數T(T < 10),表示測試數據組數。每一組測試數據包含一行,為四個整數,分別為棋盤的大小以及初始位置坐標n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 6, n < 6)

Output

每組測試數據包含一行,為一個整數,表示馬能遍歷棋盤的途徑總數,0為無法遍歷一次。

Sample Input

1 5 4 0 0

Sample 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 - 八皇后問題

?

努比亞和蘇丹沒有子女,所以他要從一些有集成資格的繼承者中挑選一個出來繼承王位。他希望這個繼承者足夠聰明,所以他準備了一個西洋棋盤,上面的每個格子中均有一個?1-991?99?的數字。他又準備了?88?個皇后棋子。

88?皇后的規則就是不能有任何棋子同行或者同列或者同斜線,在滿足這個規則的同時,王位繼承者還需要讓?88?個皇后所在的位置的數字的和是最大的。

輸入格式

輸入一個數字?k(k\leq 20)k(k≤20),代表棋盤的數量。

接下來有?kk?個棋盤,每個棋盤有?6464?個數字,分成?88?行?88?列出入,具體可見樣例,每一個數字均小于?100100。

輸出格式

每一個棋盤對應輸出最大的數值, 一共輸出?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 64

Sample 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 - 選數

已知?nn?個整數?x_1,x_2,\cdots,x_nx1?,x2?,?,xn?,以及一個整數?kk(k<nk<n)。從?nn?個整數中任選?kk?個整數相加,可分別得到一系列的和。例如當?n=4n=4,k=3k=3,44?個整數分別為?33,77,1212,1919?時,可得全部的組合與它們的和為:

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

現在,要求你計算出和為素數共有多少種。

例如上例,只有一種的和為素數: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)。

輸出格式

輸出格式為:一個整數(滿足條件的種數)。

Sample Input

4 3 3 7 12 19

Sample Output

1 #include<iostream> #include<math.h> using namespace std; int x[20],n,k;//依照題目所設 bool isprime(int n){//判斷是否質數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為全組合剩下數字的選取范圍;調用遞歸生成全組合,在過程中逐漸把K個數相加,當選取的數個數為0時,直接返回前面的累加和是否為質數即可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);//調用遞歸解決問題 }

O - 打開燈泡 Switch the Lamp On

達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。

翰翰的家里有一輛飛行車。

有一天飛行車的電路板突然出現了故障,導致無法啟動。

電路板的整體結構是一個R行C列的網格(R,C≤500),如下圖所示。

每個格點都是電線的接點,每個格子都包含一個電子元件。

電子元件的主要部分是一個可旋轉的、連接一條對角線上的兩個接點的短電纜。

在旋轉之后,它就可以連接另一條對角線的兩個接點。

電路板左上角的接點接入直流電源,右下角的接點接入飛行車的發動裝置。

達達發現因為某些元件的方向不小心發生了改變,電路板可能處于斷路的狀態。

她準備通過計算,旋轉最少數量的元件,使電源與發動裝置通過若干條短纜相連。

不過,電路的規模實在是太大了,達達并不擅長編程,希望你能夠幫她解決這個問題。

注意:只能走斜向的線段,水平和豎直線段不能走。

Input

對于每組測試數據,第一行包含正整數R和C,表示電路板的行數和列數。

之后R行,每行C個字符,字符是"/"和"\"中的一個,表示標準件的方向。

Output

對于每組測試數據,在單獨的一行輸出一個正整數,表示所需的縮小旋轉次數。

如果無論怎樣都不能使得電源和發動機之間連通,輸出NO SOLUTION。

Example

樣例輸入

3 5 \\/\\ \\/// /\\\\

樣例輸出

1

Hint

1≤R,C≤500,
1≤T≤5

#include <bits/stdc++.h>#define ll long long #define inf 0x3f3f3f3f #define il inline #define in(a) a=read() #define out(a) printf( "%d" , a ) #define outn(a) out(a),putchar('\n')#define I_int int inline I_int read() {I_int x = 0 , f = 1 ; char c = getchar() ;while( c < '0' || c > '9' ) {if( c == '-' ) f = -1 ;c = getchar() ;}while( c >= '0' && c <= '9' ) {x = (x << 1) + (x << 3) + c - 48 ;c = getchar() ;}return x * f ; } #undef I_intusing namespace std ;const int N = 510 ; const int M = (500*500+10)*4 ; const int dx[] = {0,0,1,-1}; const int dy[] = {-1,1,0,0};char a[ N ][ N ] ; int n , m ; int head[ M ] , d[ M ] , cnt , vis[ M ] ; struct node {int to , nxt , v ; } e[ M << 1 ] ;void ins( int u , int v , int w ) {e[ ++ cnt ].to = v ;e[ cnt ].nxt = head[ u ] ;e[ cnt ].v = w ;head[ u ] = cnt ; }bool check( int x , int y ) {if( x < 0 || x > n || y < 0 || y > m ) return 0 ;return 1 ; }int zb( int x , int y ) {return (x-1)*(m+1)+y ; }deque<int>q;void spfa() {vis[ 1 ] = 1 ;for( int i = 1 ; i <= (n+1)*(m+1) ; i ++ ) d[ i ] = inf ;d[ 1 ] = 0 ;q.push_front(1);while( !q.empty() ) {int u = q.front() ; q.pop_front() ;vis[ u ] = 0 ;for( int i = head[ u ] ; i ; i = e[ i ].nxt ) {int v = e[ i ].to ;if( d[ v ] > d[ u ] + e[ i ].v ) {d[ v ] = d[ u ] + e[ i ].v ;if( !vis[ v ] ) {vis[ v ] = 1 ; if(!e[i].v) q.push_front(v);else q.push_back(v) ;}}}}if( d[zb(n,m)] == inf ) puts("NO SOLUTION") ;else outn( d[ zb(n+1,m+1) ] ) ; }int main() {in( n ) ; in( m ) ;for( int i = 1 ; i <= n ; i ++ ) {scanf( "%s" , a[ i ] + 1 ) ;for( int j = 1 ; j <= m ; j ++ ) {if( a[ i ][ j ] == '\\' ) {ins( zb(i,j+1) , zb(i+1,j) , 1 ) , ins( zb(i+1,j) , zb(i,j+1) , 1 ) ;ins( zb(i,j) , zb(i+1,j+1) , 0 ) , ins( zb(i+1,j+1) , zb(i,j) , 0 ) ;}if( a[ i ][ j ] == '/' ) {ins( zb(i,j+1) , zb(i+1,j) , 0 ) , ins( zb(i+1,j) , zb(i,j+1) , 0 ) ;ins( zb(i,j) , zb(i+1,j+1) , 1 ) , ins( zb(i+1,j+1) , zb(i,j) , 1 ) ;}}}spfa() ;}

?

總結

以上是生活随笔為你收集整理的搜索zhuanti的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。