首页 > 代码库 > hdu 4951 乘法表

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                     else127                     {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 }