素数方阵(信息学奥赛一本通-T1446)
生活随笔
收集整理的這篇文章主要介紹了
素数方阵(信息学奥赛一本通-T1446)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
CE數碼公司開發了一種名為自動涂色機(APM)的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板涂色。
為了涂色,APM需要使用一組刷子。每個刷子涂一種不同的顏色C。APM拿起一把有顏色C的刷子,并給所有顏色為C且符合下面限制的矩形涂色:
為了避免顏料滲漏使顏色混合,一個矩形只能在所有緊靠它上方的矩形涂色后,才能涂色。例如圖中矩形F必須在C和D涂色后才能涂色。注意,每一個矩形必須立刻涂滿,不能只涂一部分。
寫一個程序求一個使APM拿起刷子次數最少的涂色方案。注意,如果一把刷子被拿起超過一次,則每一次都必須記入總數中。
【輸入】
第一行為矩形的個數N。下面有N行描述了N個矩形。每個矩形有5個整數描述,左上角的y坐標和x坐標,右下角的y坐標和x坐標,以及預定顏色。
顏色號為1到20的整數。
平板的左上角坐標總是(0, 0)。
坐標的范圍是0..99。N小于16。
【輸出】
拿起刷子的最少次數。
【輸入樣例】
7?
0 0 2 2 1?
0 2 1 6 2?
2 0 4 2 1?
1 2 4 4 2?
1 4 3 6 1?
4 0 6 4 1?
3 4 6 6 2
【輸出樣例】
3
【源程序】
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long #define Pair pair<int,int> const int MOD = 1E9+7; const int N = 1000000+5; const int dx[] = {-1,1,0,0,-1,-1,1,1}; const int dy[] = {0,0,-1,1,-1,1,-1,1}; using namespace std;int n,m; int bit[6]; bool bprime[100000]; int G[500000][15]; bool vis[500000][10]; int judge[20000][10],tot; int res[100];int suf[6]; int sumX[6], sumY[6]; int sum[6];void build(){//建圖int x=0;for(int i=1;i<=5;i++){if(!vis[x][bit[i]]){G[x][0]++;G[x][G[x][0]]=bit[i];vis[x][bit[i]]=true;}x=((x<<4)|bit[i]);}x=0;for(int i=5;i>=1;i--){if(!judge[x][bit[i]])judge[x][bit[i]]=++tot;x=judge[x][bit[i]];} }void dfs(int x,int y) {if(x==6){for(int i=1;i<=5;i++){for(int j=1;j<=5;j++){int pos=((i-1)<<3)|j;printf("%d",res[pos]);}printf("\n");}printf("\n");}else {int minn;if(G[sumX[x]][0]>G[sumY[y]][0])minn=sumY[y];elseminn=sumX[x];for(int i=1;i<=G[minn][0];i++){int pos=res[((x - 1) << 3) | y] = G[minn][i];int flag1,flag2;if(x+y!=6)flag1=true;else{flag1=judge[suf[x-1]][pos];suf[x]=judge[suf[x-1]][pos];}if(x!=y)flag2=true;else{flag2=vis[sum[x-1]][pos];sum[x]=((sum[x-1]<<4)|pos);}if(!flag1||!flag2||!vis[sumY[y]][pos]||!vis[sumX[x]][pos])//存在性剪枝continue;sumX[x]=((sumX[x]<<4)|pos);sumY[y]=((sumY[y]<<4)|pos);if(y<5)dfs(x,y+1);elsedfs(x+1,1);sumX[x]>>=4;sumY[y]>>=4;}} } int main() {scanf("%d%d",&n,&m);for(int i=3;i<=99999;i+=2){//判素數if(!bprime[i]){if(i>=10000){//分解數位bit[1]=i/10000;bit[2]=i/1000%10;bit[3]=i/100%10;bit[4]=i/10%10;bit[5]=i%10;if(bit[1]+bit[2]+bit[3]+bit[4]+bit[5]==n)//各數位和等于素數build();//建圖}for(int j=i*3;j<=99999;j+=2*i)bprime[j]=true;}}sum[1]=m;sumX[1]=m;sumY[1]=m;res[1]=m;dfs(1,2);return 0; }?
總結
以上是生活随笔為你收集整理的素数方阵(信息学奥赛一本通-T1446)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11(AtCoder-2649)
- 下一篇: 图论 —— 二分图