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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

搜索zhuanti

發(fā)布時(shí)間:2024/1/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搜索zhuanti 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 -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) //如果棋子數(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ù) —— 所求的最小值。

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 - 全排列

?

給定一個(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

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 - 自然數(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

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;//這個(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輸出后不換行

#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

有一個(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。

樣例

?

樣例

?

InputOutput
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 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 - 二叉樹(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 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 - 迷宮(一)

?

一天蒜頭君掉進(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**. ..*. ***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')//終點(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 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 - 八皇后問(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 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 - 選數(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 19

Sample 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 \\/\\ \\/// /\\\\

樣例輸出

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() ;}

?

總結(jié)

以上是生活随笔為你收集整理的搜索zhuanti的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。