1. 程式人生 > >二維陣列專練(一)

二維陣列專練(一)

p1077 陣列一位轉二維

題目

描述 Description
輸入一個一維陣列,按要求建立如下二維陣列,並輸出
輸入格式 Input Format
第一行一個整數n<=500
第二行,連續n個整數。
輸出格式 Output Format
按要求的二維陣列
樣例輸入 Sample Input

4(一維陣列的元素個數,保證元素個數小於等於40)
3 2 9 10 (一維陣列的各個元素,用空格隔開,保證每個數為長整範圍)
樣例輸出 Sample Output

3 2 9 10
2 9 10 3
9 10 3 2
10 3 2 9
時間限制 Time Limitation
1s

程式碼

#include<iostream>
using namespace std;
int n,a[110],b[110][110];
int main()
{
	cin >>n;
	for(int i=1;i<=n;i++){
	 cin >>a[i];
	 b[1][i]=a[i];
	}
	for(int i=2;i<=n;i++){
	b[i][n]=b[i-1][1];
		for(int j=1;j<n;j++)
		{
		b[i][j]=b[i-1][j+1];
		}
	}
	for(int i=1;i<=n;
i++){ for(int j=1;j<=n;j++) cout <<b[i][j]<<' '; cout <<endl; } return 0; }

p1078 二維陣列壓縮

題目

描述 Description
輸入一個二維陣列,有大量的零存在,將其轉換為k3的二維陣列儲存,在k3的二維陣列中,每一行的第一個數為行號,第二個數為列,第三個數為非零元素的值。
輸入格式 Input Format
第一行 m,n表示二維陣列 m行,n列 <=500
接下來 m行,n列的數,a[I,j]<=10000
輸出格式 Output Format
若干行:每行三個數,分別是 i, j,a[I,j].
要求 按照 行標從小到大,如果行標相等,列表從小打到 的順序輸出。  
樣例輸入 Sample Input

3 5
0 0 1 0 0
2 0 0 0 0
0 0 0 0 3
樣例輸出 Sample Output

1 3 1
2 1 2
3 5 3
時間限制 Time Limitation
1s

程式碼

#include<iostream>
using namespace std;
int m,n,i,j,a[510][510];
int main()
{
	cin >>n >>m;
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++){
	    cin>>a[i][j];
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
		    if (a[i][j]!=0)
	    	cout <<i<<' '<<j<<' '<<a[i][j]<<' '<<endl;
		}
	}
	return 0;
}

p1079 二維陣列最小值

題目

描述 Description
輸入一個二維陣列,找出其中最小的數,輸出它的值以及所在行號和列號。
輸入格式 Input Format
第一行 m,n表示二維陣列 m行,n列 <=100
接下來 m行,n列的數,a[I,j]<=10000
輸出格式 Output Format
三個數,分別是 a[I,j] i, j ,意義如要求
樣例輸入 Sample Input

3 5
100 20 11 30 44
22 333 1003 245 23
33 1 24 1 34
樣例輸出 Sample Output

1 3 2
時間限制 Time Limitation
1s

程式碼

#include<bits/stdc++.h>
using namespace std;
int a[100][100];
int main()
{
	int m,n,minn=10000000,row=0,column=0;
	cin>>m>>n;
	for (int i=0;i<m;i++)
		for (int j=0;j<n;j++)
			cin>>a[i][j];
	for (int i=0;i<m;i++)
		for (int j=0;j<n;j++)
			if (a[i][j]<minn)
			{
				minn=a[i][j];
				row=i;
				column=j;
			}
	cout<<minn<<' '<<row+1<<' '<<column+1<<endl;
	return 0;		
}

p1080 奶牛的相似性

題目

描述 Description
農夫John有N(2<=N<=50)頭不同的奶牛,他想要知道,哪兩頭奶牛看起來最相似,所以他給每頭奶牛拍了57的數碼相片,他想要你寫一個程式幫助他.
5
7的數碼相片可以分別出奶牛身上黑色和白色的斑塊,下面是兩頭奶牛的數碼照片(‘X’表示黑色部分,’.'表示白色部分).
   奶牛 1     奶牛 2
   …X…   …X…
   .XXX…   …XX…
   .XX…   .XX…
   …X.   .XX…X.
   .X…X.   .X…X.
要比較這兩頭奶牛,照片上的每一部分都必須仔細檢查.每一個小塊將有一個"相似性的得分".上面的那兩頭奶牛可以得到30分,因為他們只有5個地方不一樣(詳見下面的圖中的"#").
     ++##+++
     +#+++++
     +++++++
     +##++++
     +++++++
現在給你一群奶牛的照片,你的任務就是找出"相似性得分"最高的那一對奶牛,並輸出他們的編號(小的在前,大的在後).
輸入格式 Input Format
第一行:N,奶牛的數量
第2…N5+1行:奶牛的數碼照片,第I頭奶牛的照片出現在第5(I-1)+2到5*(I-1)+6行.(詳見樣例)
輸出格式 Output Format
僅一行,最相似的一對奶牛.
樣例輸入 Sample Input

3
…X…
.XXX…
.XX…
…X.
.X…X.
…X…
…XX…
.XX…
.XX…X.
.X…X.
XX…
X…
XX…XX
XXXX.XX
XXX…XX
輸入說明
兩隻題中的奶牛,外加一隻.
樣例輸出 Sample Output

1 2
輸出說明
第三隻奶牛與第1,2只奶牛的"相似性得分"分別為16和19,均低於第1只和第2只的30分.
時間限制 Time Limitation
1s
註釋 Hint
1s
來源 Source
usaco 月賽

程式碼

#include<bits/stdc++.h>
using namespace std;
const int maxn=510;
int n,minn=100,minx,miny;
char a[55][40];
void init()
{
	cin>>n;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=35;j++)
			cin>>a[i][j];
}

void work()
{
	for (int i=1;i<n;i++)
		for (int j=i+1;j<=n;j++)
		{
			int num=0;
			for (int k=1;k<=35;k++)
				if(a[i][k]!=a[j][k])
					num++;
			if(num<minn)
			{
				minn=num;
				minx=i;
				miny=j;
			}
		}
}

int main()
{
	init();
	work();
	cout<<minx<<' '<<miny<<endl;
	return 0;
}

p1081 距離最遠的牛

題目

描述 Description
有 N (2 <= N <= 500) 頭奶牛,每頭牛的位置用(X_i, Y_i),(0 <= X_i <= 5,000; 0 <= Y_i <= 5,000). 現在Farmer John想知道哪兩頭牛之間的距離最遠。
假如第一頭牛的位置是(x1, y1), 第二頭牛的位置是(x2, y2), 那麼這兩頭牛的距離: dis = sqrt( (x1- x2) * (x1 - x2) + (y1- y2) * (y1 - y2) )
,其中sqrt()表示開平方根。

例如, 下面的圖中有8頭牛,用字元C表示。

8 | . C . . . . . . . .
7 | . . . . . . . . . .
6 | . C . . . . . . . .
5 | . . . C C . C . . .
4 | . . . . C . . . . .
3 | . . C . . . . . . .
2 | . . . . . . . . . .
1 | . . . . . . . . . C
0 ±-------------------
0 1 2 3 4 5 6 7 8 8 9

那麼位於(2,8)的牛與 位於 (9,1)的牛之間的距離最遠。
輸入格式 Input Format
* 第1行: 一個整數N。

  • 第2…N+1行: 每行兩個整數: X_i and Y_i, 表示第i頭牛的位置。
    輸出格式 Output Format
    *一行: 兩個整數i和j, 表示輸入資料中第i只牛與第j只牛之間的距離最遠, 編號小的在前,編號大的在後。則要求i < j.
    樣例輸入 Sample Input

8
2 6
3 3
2 8
4 5
7 5
5 5
9 1
5 4
樣例輸出 Sample Output

3 7

樣例解釋: 輸入資料中的第3只牛的位置是:(2,8), 輸入資料中第7只牛的位置是:(9,1), 他們之間的距離最遠。
時間限制 Time Limitation
1s
註釋 Hint
1s
來源 Source
usaco 月賽

程式碼

#include<bits/stdc++.h>
using namespace std;
int n,x[6000],y[6000],z[6000][6000],maxn=-10,a,b;
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++)
		cin>>x[i]>>y[i];    
	for (int i=1;i<=n;i++)
		for (int j=i+1;j<=n;j++)
		{
			z[i][j]=sqrt( (x[i]-x[j])*(x[i]-x[j])
						+(y[i]-y[j])*(y[i]-y[j]) );//z[][]表示兩牛之間的距離· 
			if (z[i][j]>maxn)
			{
				maxn=z[i][j];
				a=i;//表示輸入資料中第i只牛 
				b=j;//與第j只牛之間的距離最遠
			}
		}
	cout<<a<<' '<<b;
	return 0;
}

p1082 倒數字三角形

題目

描述 Description
以下的數字倒直角三角形是由二個數確定的:一個數是行數R,1<=R<=39,另一個是種子數S,1<=S<=9。S放在左上角,照著樣例輸出檔案的樣子,寫一個程式,根據輸入的二個數打印出相應的數字倒直角三角形。
輸入格式 Input Format
單獨一行,二個用空格隔開的整數
輸出格式 Output Format
輸出倒直角數字三角形,輸出時數字與數字之間不留空格字元。
樣例輸入 Sample Input

6 1
樣例輸出 Sample Output

124727
35838
6949
151
62
3
時間限制 Time Limitation
1s
註釋 Hint

來源 Source
usaco 月賽

程式碼

#include<bits/stdc++.h>
using namespace std;
int a[1000],num1=1,num2=1,num3=1,d=2;
int main()
{
	int r,s;
	cin>>r>>s;
	cout<<s;
	
	num1=s;
	for(int i=1;i<r;i++) 
	{
		num1+=i;
		if (num1>9)
		{
			if (num1%9==0) cout<<9;
			else cout<<num1%9;
		}	
		else cout<<num1;
	}
	cout<<endl;
	
	num2=s;
	for (int i=1;i<r;i++)
	{
		//for (int j=1;j<=i;j++)	cout<<' ';
		num2+=d;
		if (num2>9) 
		{
			if (num2%9==0) cout<<9;
			else cout<<num2%9;
		}
		else cout<<num2;
		d++;
		
		num3=num2;
		for (int k=i+1;k<r;k++)
		{
			num3+=k;
			if (num3>9) 
			{
				if (num3%9==0) cout<<9;
				else cout<<num3%9;
			}
			else cout<<num3;
		} 
		num3=0;
		cout<<endl;
	} 
			
	return 0;
}

p1083 龍舟比賽

題目

描述 Description
現在正在舉行龍舟比賽,我們現在獲得了最後衝刺時的俯檢視像,現在你要輸出各條龍舟的名次。
這張影象由r行c列的字元組成,每行的最左邊的字元表示起點,所以字元為’S’,最右邊的字元為’F’。並且確定在9行裡有數字字元1…9,來表示每條龍舟的編號,保證包含數字的行裡,只包含連續的相同的3個數字。其餘地方都是字元’.’。 具體看樣例。越靠近右邊的龍舟排名越靠前。如果有並列的,那麼他們的名次相同。
輸入格式 Input Format
第一行是兩個整數r和c(10 ≤ r,c ≤ 50)。表示影象有r行,c列。
下面有r行字元,以字元’S’開頭,’F’結尾,還含有數字字元和’.’字元。
保證只有9行含有數字字元,並且每行的數字字元完全相同,含有3個數字。
輸出格式 Output Format
9行,第i行表示i號龍舟的名次。
樣例輸入 Sample Input

10 15
S…222F
S…111…F
S…333…F
S…555…F
S…444…F
S…F
S…777…F
S…888…F
S…999…F
S…666…F

樣例輸出 Sample Output

5
1
6
3
6
6
4
7
2

時間限制 Time Limitation
1s
註釋 Hint
注意怎麼儲存
來源 Source
coci 2009 #6

程式碼

#include<bits/stdc++.h>
using namespace std;
struct boat
{
	int num,dis,rank;
}boats[1000];
char a[1000]={};

void init()
{
	int row,column;
	ios::sync_with_stdio(false);//cin和scanf一樣快的祕訣 
	cin>>row>>column;
	for (int i=1;i<=row;i++)
	{
		for(int j=1;j<=column;j++)
		{
			cin>>a[j];
			if (a[j]>='1'&&a[j]<='9')//錯誤:a[j]<=9; 
			{
				boats[(int)a[j]-48].num=(int)a[j]-48;
				boats[(int)a[j]-48].dis=column-j;
			}
		}
	}
}

void work()
{
	for (int i=1;i<=9;i++)
		for (int j=1;j<=9;j++)
			if (boats[i].dis<boats[j].dis)
			{
				boats[0]=boats[i];
				boats[i]=boats[j];
				boats[j]=boats[0];		
			}
	for (int i=1;i<=9;i++)
		if (boats[i].dis==boats[i-1].dis)
			boats[i].rank=boats[i-1].rank;
		else 
			boats[i].rank=boats[i-1].rank+1;
	for (int i=1;i<=9;i++)
		for (int j=1;j<=9;j++)
			if (boats[i].num<boats[j].num)
			{
				boats[0]=boats[i];
				boats[i]=boats[j];
				boats[j]=boats[0];		
			}
	for (int i=1;i<=9;i++)
		cout<<boats[i].rank<<endl;
	
}
int main()
{
	init();
	work();
	return 0;
}

p1084 蛇形方陣

題目

描述 Description
By way of example, for pastures of size N=3 and N=4, here are the
routes Bessie should use:

1 2 3     1 2 3 4
   8 9 4     12 13 14 5
   7 6 5     11 16 15 6
          10 9 8 7
輸入格式 Input Format
A single integer: N (1 <= N <= 750)
輸出格式 Output Format
Lines 1…N: N space-separated integers
樣例輸入 Sample Input

3
樣例輸出 Sample Output

1 2 3
8 9 4
7 6 5
時間限制 Time Limitation
1s
來源 Source
usaco 2011月賽 spiral

程式碼

#include<bits/stdc++.h>
using namespace std;
int a[760][760];
int main()
{
	int n;
	cin>>n;
	int val=1;//起始值
	int k=n-1;//每次填充的個數
	int x=1,y=1;//起點
	for (;k>0;k-=2)
	{
		for (int i=1;i<=k;i++)	a[x][y++]=val++;
		for (int i=1;i<=k;i++)	a[x++][y]=val++;
		for (int i=1;i<=k;i++)	a[x][y--]=val++;
		for (int i=1;i<=k;i++)	a[x--][y]=val++;
		x++;
		y++;//起點往右下移動一個單位 
	} 
	if (n%2) a[n/2+1][n/2+1]=n*n;//奇數單獨處理 
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
			cout<<a[i][j]<<' ';
			//printf("%3d",a[i][j]);
		cout<<endl;
	 } 
	 return 0;
}

p1085 方塊轉換

題目

描述 Description
一塊N x N(1<=N<=10)正方形的黑白瓦片的圖案要被轉換成新的正方形圖案。寫一個程式來找出將原始圖案按照以下列轉換方法轉換成新圖案的最小方式:
1:轉90度:圖案按順時針轉90度。
2:轉180度:圖案按順時針轉180度。
3:轉270度:圖案按順時針轉270度。
4:反射:圖案在水平方向翻轉(以中央鉛垂線為中心形成原圖案的映象)。
5:組合:圖案在水平方向翻轉,然後再按照1到3之間的一種再次轉換。
6:不改變:原圖案不改變。
7:無效轉換:無法用以上方法得到新圖案。
如果有多種可用的轉換方法,請選擇序號最小的那個。
輸入格式