題目:
The Great Revegetation
(grass.cpp/in/out 1s 256M)
長時間的干旱使得Farmer John的N塊草地上牧草匱乏。隨着雨季即將到來,現在應當是重新種植的時候了。在Farm
er John的儲物棚里有四個桶,每個桶里裝着一種不同的草種。他想要在每塊草地上播種其中一種草。作為一名奶
農,Farmer John想要確保他的每頭奶牛都能得到豐富的食譜。他的M頭奶牛每一頭都有兩塊喜愛的草地,他想要確
保這兩塊草地種植不同種類的草,從而每頭奶牛都可以有兩種草可供選擇。Farmer John知道沒有一塊草地受到多
於3頭奶牛的喜愛。
請幫助Farmer John選擇每塊草地所種的草的種類,使得所有奶牛的營養需求都得到滿足。
Input
輸入的第一行包含N(2≤N≤100)和M(1≤M≤150)。
以下M行,每行包含兩個范圍為1…N的整數,為Farmer John的一頭奶牛喜歡的兩塊草地。
Output
輸出一個N位數,每一位均為1…4之一,表示每一塊草地上所種的草的種類。
第一位對應草地1的草的種類,第二位對應草地2,以此類推。如果有多種可行的解,只需輸出所有解中最小的N位數。
Sample Input
5 6
4 1
4 2
4 3
2 5
1 2
1 5
Sample Output
12133
法一:
遞歸dfs,不斷查找當前位數可擺放的最小值。
先排序,保證從上到下,從左至右為遞增狀態。
k表示位數,side表示當前可擺放的最小值
flag[k][i]表示第k位上能否放i這個數
如果左邊的值已經放好了,那么右邊的就不能放左邊的值了,flag[node[u].y][ans]=false;
因為草地的種類和在[1,N]之間,所以判斷當前最小值是否為當前的位數(保證第一位即為1)
code:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define fill(a,b) memset(a,b,sizeof(a)) 4 using namespace std; 5 bool flag[2100][5]; 6 int n,m; 7 struct kk{int x,y;}node[2100]; 8 int cmp(kk A,kk B){return A.x<B.x;} 9 void dfs(int k,int side){ 10 int u=0,ans; 11 if (k>n) return ; 12 for (int i=1;i<=4;i++) 13 if (flag[k][i]){ans=i;break;} 14 printf("%d",ans); 15 for (u=side;node[u].x==k;u++){ 16 flag[node[u].y][ans]=false; 17 } 18 dfs(k+1,u); 19 } 20 int main(){ 21 //freopen("grass.in","r",stdin); 22 //freopen("grass.out","w",stdout); 23 scanf("%d%d",&n,&m); 24 fill(flag,true); 25 for (int i=1;i<=m;i++){ 26 scanf("%d%d",&node[i].x,&node[i].y); 27 if (node[i].x>node[i].y) swap(node[i].x,node[i].y); 28 } 29 sort(node+1,node+m+1,cmp); 30 dfs(1,1); 31 return 0; 32 }/* 33 6 6 34 1 2 35 2 3 36 3 4 37 4 5 38 1 5 39 1 6 40 */
法二:
類似於法一,直接三個for循環模擬
code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int N, M; 6 int A[151], B[151], G[101]; 7 cin >> N >> M; 8 for (int i=0; i<M; i++) { 9 cin >> A[i] >> B[i]; 10 if (A[i] > B[i]) swap (A[i], B[i]); 11 } 12 for (int i=1; i<=N; i++) { 13 int g; 14 for (g = 1; g <= 4; g++) { 15 bool ok = true; 16 for (int j=0; j<M; j++){ 17 if (B[j] == i && G[A[j]] == g){ 18 ok = false; 19 20 } 21 //cout<<"G[A[j]]= "<<G[A[j]]<<" g= "<<g<<" i= "<<i<<" j= "<<j<<" A[j]= "<<A[j]<<" B[j]= "<<B[j]<<endl; 22 } 23 if (ok) break; 24 } 25 G[i] = g; 26 //cout<<"G[i]= "<<G[i]<<endl; 27 cout << g; 28 } 29 cout << "\n"; 30 return 0; 31 }