hdu 4951 乘法表
http://acm.hdu.edu.cn/showproblem.php?pid=4951
依照我原先的想法是 先找出ans[0] 和ans[1]来,这个好找吧,要是有一行全部是相等的数组成那这行的序号就是ans[0], 要是有一[i,j],i*j=ans[0] i ,那么ans[j]=1, 找到了ans[0]和ans[1] ,然后根据已知的遍历推算出其他的结果。
1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 struct node 9 { 10 int x,y,zhi; 11 } p[505][505]; 12 13 bool vis[505]; 14 int ans[505]; 15 16 int get(int x,int y,int c) 17 { 18 int w[505],num=0; 19 do 20 { 21 w[num++]=y%10; 22 y/=10; 23 } 24 while(y); 25 26 do 27 { 28 w[num++]=x%10; 29 x/=10; 30 } 31 while(x); 32 33 int sum=0; 34 for(int i=0,jie=1; i<num; i++) 35 { 36 sum+=w[i]*jie; 37 jie*=c; 38 } 39 return sum; 40 } 41 42 void solve(int n) 43 { 44 int count1=2,coun=1; 45 while(1) 46 { 47 for(int i=0; i<n; i++) 48 for(int j=0; j<n; j++) 49 { 50 51 if(vis[p[i][j].x]&&vis[p[i][j].y]) 52 { 53 if(p[i][j].zhi==-1) 54 p[i][j].zhi=get(ans[p[i][j].x],ans[p[i][j].y],n); 55 if(p[i][j].zhi!=0) 56 { 57 if(vis[i]&&!vis[j]) 58 { 59 ans[j]=p[i][j].zhi/ans[i]; 60 vis[j]=true; 61 count1++; 62 } 63 else if(!vis[i]&&vis[j]) 64 { 65 66 ans[i]=p[i][j].zhi/ans[j]; 67 vis[i]=true; 68 count1++; 69 } 70 else if(!vis[i]&&i==j) 71 { 72 73 ans[i]=p[i][j].zhi/2; 74 vis[i]=true; 75 count1++; 76 } 77 if(count1>=n) 78 return ; 79 } 80 } 81 } 82 } 83 } 84 85 int main() 86 { 87 int n,i,j,a,b,c; 88 for(int i=0;i<55;i++) 89 { 90 scanf("%d%d%d",&a,&b,&c); 91 printf("get %d\n",get(a,b,c)); 92 } 93 94 while(~scanf("%d",&n),n) 95 { 96 memset(vis,false,sizeof(vis)); 97 for( i=0; i<n; i++) 98 for( j=0; j<n; j++) 99 { 100 scanf("%d%d",&p[i][j].x,&p[i][j].y); 101 p[i][j].zhi=-1; 102 } 103 for( i=0; i<n; i++) 104 { 105 for( j=0; j<n; j++) 106 if(p[i][j].x!=p[i][j].y) 107 break; 108 if(j==n) 109 { 110 ans[p[i][0].x]=0; 111 vis[p[i][0].x]=true; 112 break; 113 } 114 } 115 116 for( i=0; i<n; i++) 117 { 118 for( j=0; j<n; j++) 119 if(!vis[i]&&!vis[j]&&ans[p[i][j].x]==0&&i*j==p[i][j].y) 120 { 121 if(i==p[i][j].y) 122 { 123 ans[j]=1; 124 vis[j]=true; 125 } 126 else 127 { 128 ans[i]=1; 129 vis[i]=true; 130 } 131 break; 132 } 133 if(j!=n) 134 break; 135 } 136 137 solve(n); 138 for( i=0; i<n; i++) 139 printf("%d ",ans[i]); 140 printf("\n"); 141 142 } 143 return 0; 144 }
上面的结果当然是错的, 起码每次找p[i][j].zhi 的时候就必须得用大数 = =
在网上看到一个很简洁的思路 膜拜一下~
http://www.cnblogs.com/yuiffy/p/3914595.html
1 #include <stdio.h> 2 #include<iostream> 3 #include <string.h> 4 #include <algorithm> 5 using namespace std; 6 int a[505][1005],ans[505]; 7 bool vis[505]; 8 9 int main() 10 { 11 int i,j,n,cas=1; 12 while(~scanf("%d",&n),n) 13 { 14 for(i=0;i<n;i++) 15 for( j=0;j<2*n;j+=2) 16 scanf("%d%d",&a[i][j],&a[i][j+1]); 17 for(i=0;i<n;i++) 18 { 19 for(j=0;j<2*n;j+=2) 20 if(a[i][j]!=a[i][j+1]) 21 break; 22 if(j>=2*n) 23 { 24 ans[0]=i; 25 26 break; 27 } 28 } 29 for(i=0;i<n;i++) 30 { 31 if(i==ans[0]) 32 continue; 33 memset(vis,false,sizeof(vis)); 34 int num=0; 35 for(j=0;j<2*n;j+=2) 36 { 37 if(vis[a[i][j]]==false) 38 { 39 vis[a[i][j]]=true; 40 num++; 41 } 42 } 43 ans[num]=i; 44 } 45 printf("Case #%d: %d",cas++,ans[0]); 46 for(int i=1;i<n;i++) 47 printf(" %d",ans[i]); 48 printf("\n"); 49 } 50 return 0; 51 }