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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

我不是四色定理

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我不是四色定理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我不是四色定理 Time Limit:2000MS?????Memory Limit:512000KB?????64bit IO Format:%I64d & %I64u Submit?Status?Practice?HDU 5113

Description

四色定理是給定的任何一個平面分離成連續的區域,產生一個包含許多區域的圖,四種顏色給不同區域涂色,任意相鄰的兩個區域顏色不能相同。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -維基百科,自由的百科全書 在這個問題上,你必須解決四色問題。嘿,我只是在開玩笑。 你需要解決一個類似的問題:有一個包含從1到K一共K種顏色的N×M棋盤,使得任意兩個相鄰的區塊不能有相同的顏色(如果它們的上、下、左、右任意一邊的顏色與自身顏色不同)。第i種顏色可以被使用Ci次。

Input

第一行包含一個整數T(1<=T<=?5000),?T表示測試用例的數量。 對每一個測試用例第一行包含三個整數N,M,K(0<N,M<=5,0<K<=N*M)。 第二行包含K個整數Ci(Ci>0),表示第i種顏色可以被使用的次數。 輸入保證C1+?C2+...+?CK=N*M。

Output

對每個測試用例,第一行包含“Case?#x:”,?x是用例的序號(?從1開始)。 如果有滿足條件的涂色方法就輸出“YES”,如果沒有就輸出“NO”。接下來的N行每行由M個表示第i種顏色的數字構成,數字之間有一個空格隔開。 如果有多重涂法,輸出其中的一種。

Sample Input

4 1 5 2 4 1 3 3 4 1 2 2 4 2 3 3 2 2 2 3 2 3 2 2 2

Sample Output

Case #1: NO Case #2: YES 4 3 4 2 1 2 4 3 4 Case #3: YES 1 2 3 2 3 1 Case #4: YES 1 2 2 3 3 1 其實題目并不難,只是有一個剪枝想不到,導致超時,這個題跟數獨的題目基本上是一樣的,這個關鍵的剪枝點就是格子中剩余的格子數(也就是沒有涂色的格子數)必須大于剩余顏色中最多的那個乘2,比如,一個3x3的格子,同一種顏色最多可以放置9個 AC代碼: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<stack> #include<queue>using namespace std; int t,n,m,k,flag; int maze[6][6]; int color[27]; int d[4][2]={{0,-1}, {-1,0}, {0,1}, {1,0}}; int check(int num, int clr)//檢測第m個點,放上i種顏色是否符合要求? { int Max=0; for(int i=1;i<=k;i++)//核心剪枝代碼? if(color[i]>Max) Max=color[i];//Max是剩余可用顏色中,數量最多的顏色的個數? if(Max*2>n*m-num+1)//如果不滿足剪枝情況,直接return 0,繼續探索下一個可用的顏色? return 0; if(color[clr]==0)//顏色用完了,該顏色就不能用了? return 0; int x,y;//根據是第幾個格子,計算出該格子在圖中的坐標? x=num/m;//行坐標? y=num%m;//列坐標? for(int i=0;i<4;i++) { int xx=x+d[i][0]; int yy=y+d[i][1]; if(xx<0 || x>=n || y<0 || y>=m) continue; if(maze[xx][yy]==clr)//如果出現了,周圍有跟它顏色一樣的,該顏色則不可用,return 0? return 0; } return 1; }void dfs(int nn) { int x,y; x=nn/m; y=nn%m; if(flag) return; if(nn >= n*m) { flag=1; return; } for(int i=1;i<=k;i++) { if(check(nn,i))//該顏色是否符合要求? { maze[x][y]=i; color[i]--; dfs(nn+1); if(flag) return; maze[x][y]=0; color[i]++; } } }int main() { scanf("%d",&t); int cnt=0,Max,MMax,MMin; while(t--) { Max=0; memset(maze,0,sizeof(maze)); flag=0; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++) scanf("%d",&color[i]); printf("Case #%d:\n",++cnt); dfs(0); if(flag) { printf("YES\n"); for(int i=0;i<n;i++) { printf("%d",maze[i][0]); for(int j=1;j<m;j++) { printf(" %d",maze[i][j]); } printf("\n"); } } else printf("NO\n"); } return 0; }

總結

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

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