The 2016 Asia Regional Contest, Tsukuba Quality of Check Digits Gym - 101158B
阿新 • • 發佈:2018-10-14
num tdi 返回值 一個 true 數字 region == names
題意:某城市公民每個人有一個五位數的id,前四位是basic id,最後一位是校驗位,校驗位是根據樣例給出的表格得到的,設某公民的id為abcde,那麽e=((((0$a)$b)$c)$d),每個公民都可能犯錯誤,例如將一位數字寫錯或者將相鄰的兩位調換,於是我們優秀的表格是應該可以判斷出錯的情況的,我們知道對於正確的id,(((((0$a)$b)$c)$d)$e)=0,但是等於0的不一定都是正確的,不等於0的一定是錯誤的,我們要求的是對於四位的basic id我們不能檢驗出來這個是否是正確的id的數量,也就是只要這個id出錯的情況可能會被判正確,那麽就是不可以的,ans就要加加
做法:直接模擬
坑點:例如1233 33調換之後與原來的值返回值也是一樣的,這樣即使一樣也不能成為不能判斷是否正確,因為33調換也是原來的值,這裏特殊考慮就可以了。
代碼如下:
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; int mp[10][10]; int num[10]; int ans; //int vis[10]; int solve_1() { int res = 0; for(int i=0; i<4; i++) { res = mp[res][num[i]]; } return res; }int solve() { int res = 0; for(int i=0; i<=4; i++) { res = mp[res][num[i]]; } return res; } bool ok() { // memset(vis , 0 , sizeof(vis)); int ttmp; for(int i=0; i<5; i++) { ttmp = num[i]; for(int j=0; j<10; j++) { if(j==ttmp) continue; num[i] = j; if(solve()==0) return false; } num[i] =ttmp; } if(num[0] != num[1]) { swap(num[0], num[1]); if(solve()==0) return false; swap(num[0], num[1]); } if(num[1] != num[2]) { swap(num[1], num[2]); if(solve()==0) return false; swap(num[1], num[2]); } if(num[2] != num[3]) { swap(num[2], num[3]); if(solve()==0) return false; swap(num[2], num[3]); } if(num[3] != num[4]) { swap(num[3], num[4]); if(solve()==0) return false; } return true; } int main() { ans = 0; for(int i=0; i<10; i++) for(int j=0; j<10; j++) scanf("%d", &mp[i][j]); for(int i=0; i<10; i++) { for(int j=0; j<10; j++) { for(int p=0; p<10; p++) { for(int q=0; q<10; q++) { num[0] = i; num[1] = j; num[2] = p; num[3] = q; num[4] = solve_1(); if( !ok() ) { ans++; // printf("%d %d %d %d %d \n", num[0], num[1], num[2], num[3], num[4]); } } } } } printf("%d\n", ans); return 0; }
The 2016 Asia Regional Contest, Tsukuba Quality of Check Digits Gym - 101158B